2011-06-25 30 views
0

看看這個代碼:語言C:爲什麼我的賦值語句會破壞我的數據?

void insert(Poly **A, int degree, int coef2) { 
    heapSize = heapSize+1; 
    Poly *key; 

    if (heapSize == 1) {  // heap was originally empty 
     key->coef = coef2; 
     key->degree = degree; 
     A[heapSize-1] = key; 
     return; 
    } 

    // create an "minus infinity" degree poly 
    int keyDegree = degree; 

    key->coef = coef2; 
    key->degree = MIN_INT; 

    A[heapSize-1] = key ; 
    heapIncreaseKey(A, heapSize-1, keyDegree); 
} 

保利是一個結構,其成員是int類型的兩種。 「A」是一個Poly指針數組。 每當執行語句「A [heapSize-1] = key」(在if塊中)時,「key」的成員由於某種原因而改變爲「垃圾」值。例如,在該語句執行之前,「key」成員的值是5和6.執行此語句後,這些值將更改爲大約8位數的垃圾數字。誰能告訴我爲什麼?由於

回答

2

key是未初始化的指針,然後取消對它的引用和賦值到它指向不存在的地方。這會被valgrind抓住。

4

你缺少

key = malloc(sizeof(Poly)); 

聲明key給你一個指針,但它並沒有在有效的位置點。解除引用key會導致未定義的行爲。

編輯

此外,它看起來像heapsize是一個全局常量,而A是一個指向堆。有一個記錄非全局大小的全局變量似乎很奇怪。

我會讓heapsize變量的範圍與A相同,並將指針傳遞給作爲處理A的函數的參數。

+0

感謝您的快速回復!我明白你的意思。事情是,我必須寫我的算法來「緩存高效」。我將在堆上分配結構的事實會影響我的系統是否更有效地使用緩存? – alguru

0

鍵是未初始化的指針,並且正在寫入它。

這種方式存在強烈的未定義行爲。

0

鍵不指向任何東西。此外,未分配「A」的長度。 建議您鑽研某個「的malloc」等:)

0

你必須malloc的指針之前使用它:)!

1

分配內存爲鍵和改變一個簽名的大小以通爲A排列。驗證heapsize是否仍在A的分配範圍內。 更好的是,如果您重構保留Poly的數組中的結構而不是指針,則不需要關鍵變量。然後,您可以直接將您的兩個輸入分配給A,例如 A [heapSize] .coef = coef2; 也可以通過在函數中使用heapSize來簡化一些事情,而不必在第一行增加它,並且只在退出點增加它。這樣你就不需要在任何地方使用heapSize-1。

+0

我注意到你在這裏擔心效率。在堆上分配指針數組的Grapevine結構幾乎沒有效率。看看你是否可以離開你預先分配的一組結構,而不是一個指針數組。 –

+0

是的,我必須確保我的代碼有效地使用緩存,因爲我將處理大量數據。感謝您的建議 :) – alguru

相關問題