1

我正在使用Malloc創建一個指針數組。不過,我接受valgrind每當我嘗試引用數組中某個索引中的某些內容時,條件跳轉或移動取決於未初始化的值。在我的代碼中,somethimes會在index []處存儲某些內容,有時不會。例如,可能有一個指針存儲在值1,4,6,但不在其他任何其他指針中。我的目標是能夠確定沒有valgrind錯誤!Malloc數組,條件跳轉到未初始化的值

typedef struct{ 
    char* symbol; 
    void* datapointer; 
    void* nextstruct; 
}Entry; 
void main(){ 
int sizeHint = 10000; //size of array 
Entry** arrayOfPointers = malloc(sizeHint * sizeof(Entry*)); 

//For the sake of keeping this simple, say I stored something 
//in a bunch of indexes in the array but NOT at 5 

if(arrayOfPointers[5] != NULL){ 
    //this is where my error comes, as it reads 
    //conditional jump or move depends on uninitilised value 
    //my goal is to be able to determine if something is stored at an index, and 
    //do something if its not stored 
} 

} 
+0

您應該使用'calloc()'來代替:它爲您執行乘法,檢查溢出並將內存初始化爲零。 –

+0

@JonathonReinhart:目前的C標準沒有要求所有'0'的位模式會使指針變量等於空指針:http://stackoverflow.com/questions/42471057/malloc-array-conditional -jump-on-uninitialized-values/42471123#comment72082868_42471123 – alk

回答

2

我的目標是能夠確定的東西存儲索引

在分配指針陣列將其設置爲所有NULL S使用它之前之後:

for (size_t i = 0; i < sizeHint; ++i) 
{ 
    arrayOfPointers[i] = NULL; 
} 

malloc()不會爲你做這個。

從C11標準(草案)7.22.3.4/2:

malloc函數爲一個對象,其大小由大小和 ,其值是不確定的指定分配空間。

+1

更好的是,使用'calloc()'。 –

+1

@JonathonReinhart:從標準的角度來看,指針值不一定等於空指針值。 – alk

+1

@JonathonReinhart:7.22.3.2:「*** calloc函數** [...]該空格被初始化爲所有的零位296)296):請注意,這不必與空指針 constant。*「 – alk

0

通過malloc進行分配後,內存不會自動初始化爲NULL(或其他任何內容)。它仍然可以包含任何東西,這就是爲什麼valgrind會提醒你比較。

初始化整個分配爲0(這是由至少GCCclangMSVC視爲NULL),可以使用:

memset(arrayOfPointers, 0, sizeHint * sizeof(Entry*)); 

的memset的功能由string.h頭文件提供。

+0

*「現在你可以確定所有的元素都是NULL *」,不幸的是,你不能。請參閱[此評論](http://stackoverflow.com/questions/42471057/malloc-array-conditional-jump-on-uninitialized-values/42471123#comment72082868_42471123)。 – alk

+0

謝謝,不知道。稍微改變了答案。 – Moritz

+0

雖然這不是明確的錯誤,但仍然沒有進一步解釋這可能意味着什麼「*通常*」沒有使答案成爲一個好答案... – alk

相關問題