尺寸为8的读取无效-Valgrind+;C

尺寸为8的读取无效-Valgrind+;C,c,valgrind,C,Valgrind,Valgrind在以下代码中报告大小为8的错误无效读取 我有一个数组声明为 struct symbol *st[PARSER_HASH_SIZE]; 当我的程序初始化时,数组中的所有元素都初始化为0 memset(&st[0], 0, sizeof(st)); 我的程序创建struct symbol的实例,并根据散列值插入上述数组。因此,该数组中只有少数元素为NULL,其他元素为有效值 下面的代码尝试删除分配的项目,valgrind在该行投诉, sym=st[i];符号!=无效的sy

Valgrind在以下代码中报告大小为8的错误
无效读取

我有一个数组声明为

struct symbol *st[PARSER_HASH_SIZE];
当我的程序初始化时,数组中的所有元素都初始化为0

memset(&st[0], 0, sizeof(st));
我的程序创建
struct symbol
的实例,并根据散列值插入上述数组。因此,该数组中只有少数元素为NULL,其他元素为有效值

下面的代码尝试删除分配的项目,valgrind在该行投诉,
sym=st[i];符号!=无效的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);
    }
}
struct symbol*sym=NULL;
/*清理符号表条目*/
对于(i=0;i对于(sym=st[i];sym!=NULL;sym=sym->next){/*来说,问题是您正在释放
sym
,然后尝试从(现在释放的)数据中访问一个值:
sym->next

对于内部循环,您可能需要这样的内容:

struct symbol *next_sym = NULL;

for(sym = st[i]; sym != NULL; ) {
    next_sym = sym->next;
    free(sym);
    sym = next_sym;
}

此外,还不清楚数组是否要包含结构或指向结构的指针

struct symbol *st[PARSER_HASH_SIZE];
说这是一个指向结构的指针数组。但是你说

当我的程序初始化时,数组中的所有元素都初始化为0

这就像对待结构一样对待条目

要清除数组,请执行以下操作:

for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}
for(int i=0;i
它应该包含指向结构的指针。您能告诉我如何正确初始化它吗?为什么不简单地
结构符号*st[PARSER\u HASH\u SIZE]={0};
for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
    st[i] = 0;
}