操作指针时堆栈上的字符串



请考虑以下代码:

char* f(char* str)
{
return ++str;
}
int main()
{
char* str = "test";
str = f(str);
//flag
return 0;
}

在"标志"处,第一个原始"t"所在的内存地址会发生什么?它会免费还是会成为"堆栈泄漏"?

char *str = "test";

这里有 2 个对象"在玩":类型char*(指向 char 的指针(的str对象和类型char[5]的未命名对象。

未命名的数组对象(内容{'t', 'e', 's', 't', 0}(用作指针的初始化值时,将转换为指向其第一个元素的指针,并且该地址被复制到str

没有内存分配,因此没有内存泄漏的机会!

字符串文字"test"将被焊接到可执行文件中,操作系统将在加载文件时将其放在只读内存中(这就是为什么尝试修改字符串文字通常会触发分段错误(。操作系统还负责正确卸载数据。

因此,这些数据不会放置在堆栈上,而是char* str。由于它是一个常规的局部变量,因此编译器插入的代码会自动释放它。

回答这个问题://flag"test"的全部内容仍将存在于操作系统最初分配的同一地址中,并且堆栈根本不会涉及此处。在处理return语句时,编译器将插入代码来清理堆栈。

最新更新