局部变量的地址空间分配和作用域导入存放在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;
}


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






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值