C 返回 char[] 警告 "returns address of local variable"

标签 c pointers return compiler-warnings

<分区>

这是家庭作业的一部分。

我试图在我的方法 getLine 中读取并返回文件的一行。

char *getLine(FILE *input) {
    char line[30];
    if(fgets(line, sizeof(line), input)!=NULL)
    {
        return line;
    }else{
        return NULL;
    }
}

根据我所学的有关指针的知识,这似乎可行,但是我无法删除警告消息 warning: function returns address of local variable [enabled by default]。此警告是指 return line; 行。我的作业要求我在编译时没有警告或错误。我看不出我做错了什么。

我找到的大部分帮助都建议为文本行分配空间,但我们还没有在类里面讨论过,尽管我在另一个类上做过一些。这真的是最好的方法吗?如果是这样,我可以在程序中的任何地方释放吗?

最佳答案

char line[30]; 是一个自动存储时长的数组。一旦执行超出您的函数范围,它所在的内存就会被释放,因此指向您返回的该内存的指针将变为无效(悬空指针)。

尝试访问已被释放的内存会导致未定义的行为

您可以动态分配您的数组并让调用者明确地释放它:

char *getLine() {
    char* line = malloc(30);
    ...
    return line;
}

// somewhere:
char* line = getLine();
...
free(line);

关于C 返回 char[] 警告 "returns address of local variable",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14872518/

相关文章:

c++ - 在速度方面是否值得在交换之前比较值(value)?

java - 如何让我的程序(彩票游戏)再次检查提示?

c++ - 函数中的 vector - 如何返回

c# - 如何对具有动态返回值的方法进行单元测试?

c - 为什么忽略 SIGTRAP 对 asm 不起作用?

c - 在 "in-order tree traversal"中查找特定节点

pointers - golang 类型断言,接口(interface){}(指针)和接口(interface){}(对象)有什么区别?

c++ - 在 C++ 中交换指针地址

c++ - 在没有 super 用户的情况下在 linux 中打开 RAW 套接字

c - 是否可以在没有 for 循环的情况下执行“离散”几何和?