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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54068.html