用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++时,能不用指针就别用了吧!
下一篇: android 下载安装apk详情记载