欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用vs2017编译c++时出现错误: 0xC0000005: 读取位置 0xCDCDCDCD 时发生访问冲突

程序员文章站 2022-03-11 22:37:08
...

指针真的会乱指

笔者在一次数据结构的实验时,构造了以下代码
StuInfo<T> *p = new StuInfo<Data>;
		p=head;
	if (account <= 0) return 0;
	for (int k = 0; k < account; k++)
	{
		if (p == 0) return 0;
		if (count == 0) { head = info; count++; return -1; }
		if (p->next == 0) { p->next = info; count++; return -2; }
		p = p->next;
	}
	info->next = p->next;
	p->next = info;
	return 1;

这段代码是采用模板形式的类中的函数实例,在编译过程中是通过的,但是运行到

info->next = p->next;

时会出现
0xC0000005: 读取位置 0xCDCDCDCD 时发生访问冲突
的程序中断提示,经多方查证,得知:

* 0xcdcdcdcd : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory

就是使用了定义了但未初始化的内存块,从而导致指针在debug时赋予了一个0xcdcdcdcd,也就是一个报错时经常见到的字符串**‘烫烫烫烫……’**。
解决方式:
作者是以一个结构体作为类模板的实例化的,既如下代码所示:

struct Data {
	char name[STU_INFO_SIZE];  //学生姓名
	char id[STU_INFO_SIZE];  //学生学号
	char sex[STU_INFO_SIZE];  //学生性别
	char birthday[STU_INFO_SIZE]; //学生出生日期
	char health[STU_INFO_SIZE]; //学生身体状况
	}
	
template<class T>
student<T>::student() //构造函数实现
{
	count = 0;
	head = new StuInfo<T>;
}

student<Data> *Stu;	//构造实例对象

从上面代码中不难看出Data整个数据域内存都是未初始化的,但在编译过程中是健康的,到了运行时,Data这个数据域就会因为没有赋予初值而出现 0xC0000005: 读取位置 0xCDCDCDCD 时发生访问冲突 的中断提示。

在使用memset()函数对Data中的数据域进行赋初值后,就不会出现中断提示了!

修改后代码如下:

struct Data {
	char name[STU_INFO_SIZE];  //学生姓名
	char id[STU_INFO_SIZE];  //学生学号
	char sex[STU_INFO_SIZE];  //学生性别
	char birthday[STU_INFO_SIZE]; //学生出生日期
	char health[STU_INFO_SIZE]; //学生身体状况
	Data() {
		memset(name, 0, sizeof(char) * 20);
		memset(id, 0, sizeof(char) * 20);
		memset(sex, 0, sizeof(char) * 20);
		memset(birthday, 0, sizeof(char) * 20);
		memset(health, 0, sizeof(char) * 20);
	}
};
template<class T>
student<T>::student() //构造函数实现
{
	count = 0;
	head = new StuInfo<T>;
}

student<Data> *Stu;	//构造实例对象

c++的指针真的十分危险,因为有时候你不知道 它 会指到哪儿去=-=!!
所以大家在写c++时,能不用指针就别用了吧!

相关标签: 指针