2015-02-07 16 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

相關問題