C:函数返回指针

sus*_*sdu 1 c pointers function

我在概念问题上有困难

考虑这段代码:

char *myfunc()
{
char *temp = "string";
return temp;
}

int main()
{
char* ptr = myfunc();
} 
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么ptr在函数调用后指向"string".myfunc()在堆栈中创建一个地址,该地址的值为"string",另一个地址的地址为"string".当函数结束时,它在堆栈中的内存被释放,因此它应该返回一个指向不再包含"string"的地址的指针.

Som*_*ude 6

temp变量的位置在堆栈上,但字符串文字(到哪些temp点)的位置不存储在堆栈中.所有字符串文字都具有程序完整运行时的生命周期,因此指向字符串文字的指针可以自由传递.

但是你应该养成const char *在指向字符串文字时使用的习惯,因为字符串文字无法修改.


来自ISO/IEC 9899:2011,§6.4.5/ 6:

然后使用多字节字符序列初始化静态存储持续时间的数组

(强调我的)

当规范说"静态存储持续时间"时,它意味着生命周期与程序的执行相同.

  • @haccks请记住,在C值中传递值并通过值*返回*,这意味着将复制该值.返回指针意味着*指针*由值传递/返回,即指针被复制. (3认同)
  • 这里指针不是数组也许很重要.在这种情况下很重要,因为如果`temp`被声明为`char temp [] ="string";`,则OP的代码将*不正确. (2认同)