【问题标题】:function return wrong value is mark return value is "char*" [duplicate]函数返回错误值是标记返回值是“char *”[重复]
【发布时间】:2015-11-15 10:18:39
【问题描述】:

这是我的代码,当我返回 "fo" 时,结果是 "0x7fffffffd870 "fo" ",我的问题是如何让它返回 "fo"?

#include <stdio.h>
#include <string.h>
#include <regex.h>

char *substr(char *s, int from, int to) {
    int n = to - from + 1;
    char subs[n];
    strncpy(subs, s + from, n);
    return subs;
}

int main(int argc, char **argv) {
    char *s = substr("foo", 0, 1);
    puts(s);
    return (0);
};

更新,这里是正确的代码,但我不知道char subs[n]char* subs=malloc(n) 之间有什么区别

char *substr(char *s, int from, int to) {
    int n = to - from + 1;
    char *subs = malloc(n);
    strncpy(subs, s + from, n);
    return subs;
}

int main(int argc, char **argv) {
    char *s = substr("foo", 0, 1);
    puts(s);
    return (0);
};

【问题讨论】:

  • subs 是一个自动变量。当函数退出并返回这样的变量是未定义行为时,它会超出范围。您的主要选择是将缓冲区传递给substr 函数,或者让substr 函数分配动态内存并将其返回给调用者。

标签: c


【解决方案1】:

更新,这里是正确的代码,但我不知道 char subs[n] 和 char* subs=malloc(n) 之间有什么区别

不同之处在于char subs[n] 是一个本地数组,并且是在栈上分配的。它的生命周期是直到函数 substr 终止。外部功能块无法访问此数组。

但是,当您将内存分配给 char *subs 时,它是在堆上分配的,并且它指向由 malloc 分配的内存块,即使在您的函数 substr 终止之后也是如此。但是你需要在调用函数时free这个内存。

【讨论】:

    【解决方案2】:

    char subs[n] 是一个静态字符串(作为字符数组的字符串): 尺寸是固定的,不能改变。 char* subs = malloc(n) 是一个动态字符串: 它的维度是动态的,可以通过重新分配内存来改变(例如realloc),或者我可以完全释放free(subs)

    所以区别在于你如何将字符串存储在内存中:

    • 您分配了静态内存量(在堆栈中)-> char subs[n]
    • 您分配了一个可以改变的动态内存量(在 HEAP 中)-> char* subs =malloc(n)

    【讨论】:

      【解决方案3】:

      当每个程序开始执行时,它都会在堆栈上分配内存。

      在第一个程序中,子字符数组是自动变量,内存分配在堆栈上。 一旦函数调用完成,它就会删除它的堆栈内存。 在函数调用的最后,您返回数组的地址,该地址在函数调用结束后具有垃圾值,这会导致 悬空指针(即您试图访问没有任何内容的内存)。

      要克服这种情况,您需要分配堆内存,这可以使用 c 中的 ma​​lloc 来完成。一旦它在堆上创建了内存,程序不会自动删除它,你需要使用 free 关键字删除它,否则会导致溢出。 克服这个问题的另一种方法是,创建全局变量,它的作用域是整个程序,你可以在任何你想要的地方访问它。

      【讨论】:

        猜你喜欢
        • 2014-10-23
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2019-02-08
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 2016-03-26
        相关资源
        最近更新 更多