大小为 8 的无效读取 - Valgrind + C
Posted
技术标签:
【中文标题】大小为 8 的无效读取 - Valgrind + C【英文标题】:Invalid read of size 8 - Valgrind + C 【发布时间】:2010-10-27 17:07:58 【问题描述】:Valgrind 在以下代码中报告错误Invalid read of size 8
。
我有一个声明的数组,
struct symbol *st[PARSER_HASH_SIZE];
当我的程序初始化时,这个数组中的所有元素都初始化为0。
memset(&st[0], 0, sizeof(st));
我的程序创建struct symbol
的实例并根据哈希值插入到上述数组中。因此,该数组中的元素很少是 NULL,而其他元素将是有效值。
以下代码尝试删除分配的项目,并且 valgrind 在该行抱怨,
sym = st[i]; sym != NULL; sym = sym->next
struct symbol *sym = NULL;
/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++)
for(sym = st[i]; sym != NULL; sym = sym->next) /* <-- Valgrind complains here */
free(sym);
我正在尝试了解此错误的原因。
任何帮助都会很棒!
【问题讨论】:
【参考方案1】:问题是您正在释放sym
,然后尝试从(现已释放的)数据中访问一个值:sym->next
。
你可能想要这样的内部循环:
struct symbol *next_sym = NULL;
for(sym = st[i]; sym != NULL; )
next_sym = sym->next;
free(sym);
sym = next_sym;
【讨论】:
【参考方案2】:也不清楚你的数组是包含结构还是指向结构的指针
struct symbol *st[PARSER_HASH_SIZE];
说它是一个指向结构的指针数组。但是你说
“当我的程序初始化时,这个数组中的所有元素都初始化为0。”
memset(&st[0], 0, sizeof(st));
这将条目视为结构
清除数组做
for (int i = 0; i < PARSER_HASH_SIZE; i++)
st[i] = 0;
【讨论】:
它意味着包含指向结构的指针。你能告诉我如何正确初始化它吗? 为什么不简单地struct symbol *st[PARSER_HASH_SIZE] = 0;
?以上是关于大小为 8 的无效读取 - Valgrind + C的主要内容,如果未能解决你的问题,请参考以下文章