Valgrind使用未初始化的价值

时间:2015-02-07 05:32:56

标签: c memory-management valgrind

我正在为我正在编写的编译器创建一个符号表,当我尝试添加到我的符号表时,我不断收到valgrind错误。当我调用我的函数时,我正在调用我的添加函数

stAdd (&sSymbolTable, "test", RSRVWRD, 4, 9);

并且在我的stAdd函数中它当前是

void stAdd (StPtr psSymbolTable, char *identifier, SymbolTableType type,
    int addressField, int arrayDimensions)
{
  int hashValue;

  hashValue = hash (identifier, psSymbolTable->numBuckets);

  if (psSymbolTable->spSymbolTable[hashValue] == NULL)
  {
    psSymbolTable->spSymbolTable[hashValue] = (StEntryPtr) malloc (sizeof(StEntry));
    strcpy (psSymbolTable->spSymbolTable[hashValue]->identifier, identifier);
    psSymbolTable->spSymbolTable[hashValue]->entryLevel = psSymbolTable->currentLevel;
    psSymbolTable->spSymbolTable[hashValue]->type = type;
    psSymbolTable->spSymbolTable[hashValue]->addressField = addressField;
    psSymbolTable->spSymbolTable[hashValue]->arrayDimensions = arrayDimensions;
    psSymbolTable->spSymbolTable[hashValue]->psNext = NULL;
  }
}

但每次我在StEntry中设置一个值时,我都会收到错误

  

使用8号的单位化值

每次我在if语句中设置内容。有没有看到我出错的地方?

我的StEntry是

 typedef struct StEntry
{
  char identifier[32];
  SymbolTableLevel entryLevel;
  SymbolTableType type;
  int addressField;
  int arrayDimensions;
  StEntryPtr psNext;
} StEntry;

1 个答案:

答案 0 :(得分:1)

如果我能看到struct StEntry的定义甚至是精确的valgrind错误,这将会容易得多。但无论如何我都会疯狂猜测,因为我感到过于自信。

在这里,您malloc新的StEntry,您将继续填写:

psSymbolTable->spSymbolTable[hashValue] = (StEntryPtr) malloc (sizeof(StEntry));

顺便说一下,这是C.你不需要投射malloc的结果,通常不这样做。就个人而言,我更喜欢:

StEntry* new_entry = malloc(sizeof *new_entry);
// Fill in the fields in new_entry
psSymbolTable->spSymbolTable[hashvale] = new_entry;

实际上,我也放弃了匈牙利语前缀,但这完全是其他讨论,主要是基于意见的。但我离题了。

接下来你要做的是:

strcpy (psSymbolTable->spSymbolTable[hashValue]->identifier, identifier);

现在,psSymbolTable->spSymbolTable[hashValue]->identifier可能是char *,它将指向与此符号表条目对应的标识符的字符串。所以它是一个指针。但它的价值是什么?答:它没有。它坐在一块malloc&d和未初始化的记忆中。

所以当strcpy尝试将它用作字符串的地址时......好吧,注意飞行蜥蜴。 (如果这是问题所在,您可以使用strdup代替strcpy进行快速修复。)

现在,我可能错了。也许identifier成员不是char*,而是char[8]。然后它指出的内容没有任何问题,但也没有什么能阻止strcpy写完它的结尾。无论哪种方式,都有关于该行的笨拙的事情,需要修复。