我在概念问题上遇到困难
考虑这段代码:
char *myfunc()
{
char *temp = "string";
return temp;
}
int main()
{
char* ptr = myfunc();
}
我无法理解为什么ptr在函数调用后指向“string”。 myfunc()在堆栈中创建一个地址,该地址的值为“string”,另一个地址的地址为“string”。 当函数结束时,它在堆栈中的内存被释放,因此它应该返回一个指向不再包含“string”的地址的指针。
答案 0 :(得分:6)
temp
变量的位置在堆栈上,但字符串文字的位置(temp
点)未存储在堆栈中。所有字符串文字都具有程序完整运行时的生命周期,因此指向字符串文字的指针可以自由传递。
但是你应该养成在指向字符串文字时使用const char *
的习惯,因为字符串文字无法修改。
来自ISO / IEC 9899:2011,§6.4.5/ 6:
然后使用多字节字符序列初始化静态存储持续时间
的数组
(强调我的)
当规范说“静态存储持续时间”时,它意味着生命周期与程序的执行相同。