2014-11-02 64 views
-1

我目前有一個結構對的數組。爲了插入一個新元素,我將數組重新分配給arraySize + 1,然後將insertIndex,arraySize-insertIndex移到目標arr + insertIndex + 1。這個邏輯有什麼不對嗎?我收到Uninitialised value was created by a heap allocation,我懷疑這是因爲有一些不正確有關此實現......Realloc和memmove

的代碼是在這裏:

arraySize++; 
arr = realloc(arr,arraySize*sizeof(pair));    

... 
/* Calculate insertIndex */ 
...                 
if (insertIndex+1 < numPairs) {           
     memmove(arr+insertIndex+1,arr+insertIndex,arraySize-insertIndex-1); 
} 
+3

大小必須是來自'realloc()'手冊頁的'sizeof(pair)' – BLUEPIXY 2014-11-02 21:59:25

+1

的大小:「該函數可以將內存塊移動到新位置(其地址由函數返回) 「。 – 2014-11-02 21:59:46

+2

或者它可能在失敗時返回0 ... – Deduplicator 2014-11-02 22:03:52

回答

2

有兩個問題與您的代碼:

  1. realloc失敗時可能返回0,在這種情況下,舊指針仍然有效。
    (如果您沒有請求空間,請不要擔心它可能返回0)
  2. 您需要乘以元素數memmove應隨元素大小移動。

順便說一下,更喜歡sizeof *pointersizeof(elementtype),這是不太容易出錯的。另一方面,無條件地打電話會稍微簡化你的代碼(總是很棒),並且在多次使用(度量)方面可能不會更昂貴,但它甚至可能更具性能。