为什么返回自动(内部范围)指针不好?

时间:2012-07-09 21:39:09

标签: c

  

可能重复:
  returning a local variable from function in C

我想的越多,我就越不确定为什么这不是一个好主意...编译器抱怨从函数内部返回一个自动变量返回给调用者。例如:

char * foo() {
   char bar[11];
   fgets(bar, 10, stdin);
   return bar;
}

对战:

char bar[11];
char * foo() {
   fgets(bar, 10, stdin);
   return bar;
}

我可能没有多大意义。我不太明白内部有一个指针声明的问题,调用者是不是只假设内存地址?

3 个答案:

答案 0 :(得分:1)

在第一个示例中,数组bar是函数的本地,因此当函数返回时它不再存在。因此,结果指针不太可能指向任何有用的东西,因为它过去指向的东西不再存在。

答案 1 :(得分:0)

第一个例子是完全错误的。您创建内存空间并在函数内部写入并返回指向它的指针,因此您将返回指向不存在的内存段的指针。从函数返回后将释放该内存。第二个例子是正确的,但如果可能的话,你应该避免使用全局变量。

编辑:如果希望在返回指针后将内存用于函数外部,请使用动态内存分配(检查calloc函数)。

答案 2 :(得分:0)

对于所有意图和目的,

bar在函数返回时不再存在。它被分配了自动存储持续时间,并且稍后尝试从该存储器读取会导致未定义的行为。由于通常使用堆栈,一旦函数返回,您会如何想象将数据保持在有效状态?

相反,您可以将char*作为函数的输入,以及它所引用的内存块的大小,并为调用者填充该缓冲区,即:

void foo(char *buf, buf_size) {
   fgets(buf, buf_size, stdin);
}

这在C中非常常见和惯用。看看fgets正在做什么。它要求您(呼叫者)提供缓冲区来填充。这可以避免混淆谁负责释放从函数返回的内存(如果函数返回指向动态分配内存的指针,则必须记录该函数)。

BTW,fgets读取num-1个字符并为您终止空终止,因此只需传递缓冲区的大小,无需像当前那样传递size-1