尺寸为8的读取无效-Valgrind+;C
Valgrind在以下代码中报告大小为8的错误尺寸为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
无效读取
我有一个数组声明为
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;
}