大小为 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-&gt;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的主要内容,如果未能解决你的问题,请参考以下文章

大小为 4 valgrind 的读取无效

C - valgrind - 大小为 1 的无效读取

Valgrind 大小为 4 的无效读取(OpenCV)

valgrind 使用 std::string 报告无效读取

分段错误 - 大小为 8 的无效读取

free():fclose 上的下一个大小(正常)无效。但不是在 Valgrind 运行时[重复]