C - 返回没有malloc的char指针

Fis*_*her 7 c heap stack pointers

请考虑以下代码:

char* pointerTesting(void) {

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

int main() {

   char* string = pointerTesting();
   printf("string: %s\n", string);
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mys*_*ial 14

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

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

但是,如果你这样做:

char test[] = "hello";
return test;
Run Code Online (Sandbox Code Playgroud)

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

*虽然通常情况如此,但标准并未说明它必须存储在全局内存中.
但重要的是,字符串文字的生命周期是整个程序的持续时间.(看评论)

  • 该标准不使用术语"全局记忆",我不是100%确定它意味着什么.该标准要求对应于字符串文字的数组具有静态存储持续时间,这意味着它的生命周期是程序的整个执行.(术语"全局"通常指生命周期和可见性.) (4认同)

Joh*_*ode 5

您传回test,这是字符串文字中第一个字符的地址"hello"(其中,像所有的字符串常量,存储为数组char以这样的方式,它是可用于程序的生命周期).如果你试图返回地址test供以后使用,那么是的,你会遇到了问题.

现在,下面的代码片段将不会工作:

char *pointerTesting(void)
{
  char test[] = "hello";
  return test;
}
Run Code Online (Sandbox Code Playgroud)

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