问题描述
作为一个刚入门的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;
}