我正在为我正在编写的编译器创建一个符号表,当我尝试添加到我的符号表时,我不断收到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;
答案 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
写完它的结尾。无论哪种方式,都有关于该行的笨拙的事情,需要修复。