您的位置:首页 > 产品设计 > UI/UE

局部变量的地址空间分配和作用域导入存放在deque中的字符串出现乱码

2016-07-10 23:11 246 查看
// normal_bug.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"iostream"
#include <deque>
#pragma warning(disable:4996)

using namespace std;

deque<char*> getDeque();
int main()
{
for (auto deque : getDeque())
{
cout << deque << endl;
}
return 0;
}

deque<char*> getDeque() {

char a[5][20] = {
"11111",
"22222",
"33333",
"44444",
"55555"
};
deque<char*> myDeque;
for (size_t i = 0; i < 5; i++)
{
char ptemp[20];
strcpy(ptemp, a[i]);
myDeque.push_back(ptemp);
}

return myDeque;
}




在执行了上面的代码之后出现了这样的 错误,打印出来的东西全部都是乱码,这个很奇怪啊,上面代码怎么看也找不到哪里会有问题啊,既然出现问题了,在表面上也找不到错误在哪,因此,只有通过debug来查找错误了。



从上面的debug中好像看到了一些问题了,在deque里面所有的字符串都是 “55555”,而且他们的地址都是一样的,而且还有一个问题,在最后输出的时候都是乱码的,并不是“55555”。然后我能想到的就是可能局部的变量   char ptemp[20];  这句代码有问题,我的猜想是:ptemp 是个for循环里的局部变量,每一次循环ptemp都会经历地址空间的分配和销毁,但是每一次进行地址空间的再分配时都是原来的那个地址,然后我们每一次将ptemp  push_back()到deque中时都是同一个地址,保存的都是同一个字符串,当跳出for循环时ptemp
的作用域已经失效,地址空间被收回,故最后我们看到输出都是乱码的,那么我们就再次修改一下代码。给局部变量自己进行地址空间的分配

char ptemp[20];


以下是修改后的代码

// normal_bug.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include"iostream"
#include <deque>
#pragma warning(disable:4996)

using namespace std;

deque<char*> getDeque();
int main()
{
for (auto deque : getDeque())
{
cout << deque << endl;
}
return 0;
}

deque<char*> getDeque() {

char a[5][20] = {
"11111",
"22222",
"33333",
"44444",
"55555"
};
deque<char*> myDeque;
for (size_t i = 0; i < 5; i++)
{
char* ptemp = (char*)malloc(sizeof(char) * 20);
strcpy(ptemp, a[i]);
myDeque.push_back(ptemp);
}

return myDeque;
}


然后再重新运行以下,然后就可以了,最后证实我的猜想是对的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息