我是靠谱客的博主 故意云朵,最近开发中收集的这篇文章主要介绍局部变量的地址空间分配和作用域导入存放在deque中的字符串出现乱码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


// 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;
}

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






最后

以上就是故意云朵为你收集整理的局部变量的地址空间分配和作用域导入存放在deque中的字符串出现乱码的全部内容,希望文章能够帮你解决局部变量的地址空间分配和作用域导入存放在deque中的字符串出现乱码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部