C - 返回没有malloc的char指针

时间:2011-12-15 00:35:08

标签: c pointers stack heap

请考虑以下代码:

char* pointerTesting(void) {

    char* test = "hello";
    return test;
}

int main() {

   char* string = pointerTesting();
   printf("string: %s\n", string);
}

编译和运行没有问题。但是,根据我的理解,这应该不起作用,因为分配给test指针的内存在堆栈上,并且在返回main时它被销毁。

所以问题是,如果在pointerTesting()函数中没有malloc,它如何工作?

3 个答案:

答案 0 :(得分:14)

在这种情况下,字符串"hello"存储在全局内存*中。所以已经分配。

因此,从函数返回时它仍然有效。

但是,如果你这样做了:

char test[] = "hello";
return test;

然后不,它不会起作用。 (未定义的行为)在这种情况下,字符串实际上是一个本地数组 - 当函数返回时它不再存在。

*虽然通常情况如此,但标准并未说明它必须存储在全局内存中。
但重要的是,字符串文字的生命周期是整个计划。 (见评论)

答案 1 :(得分:5)

您将返回test,这是字符串文字"hello"中第一个字符的地址(与所有字符串文字一样,存储作为char的数组,以便在程序的生命周期内可用。如果您尝试返回test地址供以后使用,那么是的,您会遇到问题。

现在,以下代码段将工作:

char *pointerTesting(void)
{
  char test[] = "hello";
  return test;
}

在这种情况下,您尝试返回函数本地的数组对象中第一个元素的地址,该函数退出后将无效。请记住,在大多数上下文中,类型为“N元素数组T”的表达式将替换为“指向T的指针”类型的表达式,其值是数组中第一个元素的地址。

答案 2 :(得分:2)

诀窍是test所引用的内存不在你预期的堆栈中。有关解释,请参阅String literals: Where do they go?