结构体中指针未初始化:0xC0000005: 写入位置 0xcccccccc 时发生访问冲突


问题描述

作为一个刚入门的C++小白,来记录一下在学习C++过程中遇到的常见Bug。
问题来源,剑指Offer第2版。面试题14:字符串中的变位词。字符串 s1 = “ac”, s2 = “dgcaf”,则 s1 的变位词 “ca”,为 s2 的子字符串。
在构建解题思路过程中,想到了哈希表,可是在定义哈希表、初始化哈希表的编译过程中,则出现了0xC0000005: 写入位置 0xcccccccc 时发生访问冲突的bug。

0xcccccccc的含义:编译器为没有初始化指针填充的地址值

出现编译错误的部分代码如下:

#define HashLength 26   //定义哈希表的表长
//定义哈希表中存储元素的数据结构
typedef struct
{
	int value;	//元素的值
	int freq;	//元素出现的频率
}Elem;
//定义哈希表的属性与结构
typedef struct
{
	Elem * ptr;	//指针便于对哈希表中的各元素值及出现频率进行初始化
	int length;	//哈希表的表长
}
//初始化哈希表
void IniHash(HashList &H)
{
	H.length = HashLength;  //哈希表表长
    for(int i = 0; i < HashLength; i ++)
    {
        H.ptr[i].value = -1;	//初始化哈希表中的元素值为-1;
        H.ptr[i].freq = 0;		//每个字母出现的频率为0;
    }
}
int main()
{
	HashList H;
	IniHash(H);
	system("pause");
	return 0;
}

编译报错如下:
在这里插入图片描述

原因分析:

主函数在调用 IniHash(H) 时,会对内存地址赋值操作。即 H.ptr[i].value = -1,而指针 ptr 未进行初始化操作,被分配的时随机地址,即野指针。而编译器为了我们方便调试程序,为这个指针填充了0xcccccccc的地址值,以方便我们快速排错。当对这块内存地址进行赋值操作时,也就发生了“写入位置 0xcccccccc发生访问冲突 ”的问题。


解决方案:

将未初始化的指针,在堆区分配一块内存空间。

int main()
{
	HashList H;
	H.ptr = new Elem[HashLength];	//	初始化指针变量
	IniHash(H);	//完成赋值初始化操作
	system("pause");
	return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值