2015-02-07 74 views
0

我正在为我编写的编译器创建符号表,并且当我尝试添加到符号表时,我不断收到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 struckt内设定值时,我得到一个错误

使用尺寸8

每一个的unitialised价值我在if语句中设置了一些东西。有没有看到我要去哪里错了?

我StEntry是

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

'valgrind'不会给你行号吗?如果你使用'-g'编译代码(如果你没有这样做,那么你应该很好,因为如果它不能告诉你这条线,你就会抛弃很多'valgrind'的用处号)。它指向哪条线?什么是完整的信息? – 2015-02-07 05:49:11

+0

@JonathanLeffler总共有8个错误,从if语句的每一行指向下方 – 2015-02-07 05:55:22

+1

如果其中一行指向的是'if'语句,那么您的'spSymbolTable'数组的初始化方式有问题。你可能应该使用'calloc()',或者循环访问数组,并在首次分配时将每个条目设置为NULL。请注意'malloc()'不保证将内存调零。看起来,事情从那里走下坡路。至少你有'valgrind'来指出你的方式的错误。 – 2015-02-07 06:00:31

回答

1

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

在这里,你mallocStEntry,您将继续填写:

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和未初始化的内存块中。

因此,当strcpy试图使用它作为字符串的地址...以及注意飞行的蜥蜴。 (如果这是问题,你可以通过使用strdup而不是strcpy来修复它。)

现在,我很可能是错的。也许identifier成员不是char*,而是char[8]。然后,它指向的内容没有问题,但也没有任何东西阻止写作超出其结尾。所以无论如何,这条线有些不明确的地方,需要修正。

+0

我的标识符是一个数组而不是char *。我添加了我的StEntry结构的定义。 – 2015-02-07 05:58:42

+0

@john:好的。然后你应该用strncpy替换strcpy(但是你打算告诉那些喜欢32个字符标识符的人?) – rici 2015-02-07 06:07:47

+0

@rici:raw'strncpy()'不是解决方案;它并不总是null终止字符串。 – 2015-02-07 06:16:23