【问题标题】:Invalid read of size 8 - Valgrind + C大小为 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);
    }
}

我正在尝试了解此错误的原因。

任何帮助都会很棒!

【问题讨论】:

    标签: c valgrind


    【解决方案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};
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      相关资源
      最近更新 更多