函数返回后未销毁字符数组
Char array not destroyed after function returns
在下面的代码中,我希望tmp字符数组在f()返回后被销毁,因此根本不应该打印x。
然而,在下面的函数中,x在main()中打印,但for循环没有打印正确的内容。有人能解释一下这种行为吗。这是输出。
abcdefg一bcdefgabcdefg?
kYi
#include <iostream>
using namespace std;
char* x;
void f()
{
char tmp[100]= "abcdefg";
x = tmp;
cout << x << endl;
for(int i=0; i < 7; i++)
cout << x[i] << endl;
}
int main()
{
f();
cout << x << endl;
for(int i=0; i < 7; i++)
cout << x[i] << endl;
}
您所做的是未定义的行为,您有一个指向内存位置的指针,该位置可能不正确,也可能不正确。这太糟糕了。
实际发生的情况是,char缓冲区tmp位于函数f()
的堆栈帧上,当该函数返回时,数据留在堆栈上,由未来的堆栈帧重写。
做你所做的事情的正确方法是简单。
std::string f() {
std::string str ("abcdefg");
std::cout << str << 'n';
return str;
}
int main() {
std::string s=f();
std::cout << s << 'n';
}
您正在调用未定义的行为。f()
作用域关闭后,指针可能有效,也可能无效。
您正在调用UB。您访问的内存不再分配给您的程序。幸运的是,它第一次印刷就成功了。
在您的程序中,x
被定义为全局指针,当char temp[100]
在堆栈上分配时,它会用堆栈上的地址初始化。当函数f
返回时,堆栈指针递减。然而,x
将继续指向将不具有正确值的相同存储器位置,因此,观察到不正确的输出。
相关文章:
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- 字符数组中的元素数
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- 使用字符数组作为 Map 中的键
- C++:__aligned(__alignof__) 导致字符数组数据出现问题?
- 按顺序声明的字符数组重叠
- 在 C++ 中字符串的大小与字符数组的大小
- 寻找一种更好的方法来表示无符号字符数组
- 如何打印 2D 字符数组C++
- 从字符数组的元素中减去'a'是什么意思
- 我是否不正确地集中了这些字符数组?