2012-08-11 60 views
0

此代碼在最後一行提出分段錯誤。頭是一個指向連續內存塊的指針,它全部爲0,並且取消引用其餘部分返回0,這可能與該問題有關。我仍然覺得這應該起作用,那麼問題是什麼?嘗試設置取消引用的指針時發生分段錯誤?

void setHeader(void *header, size_t payload) { 
    size_t *remainder = (size_t*)((char *)header + (payload + 4)); 
    *remainder = payload; 
} 
+0

你如何分配頭和什麼是有效載荷? – 2012-08-11 23:08:02

+0

此代碼適用於內存分配器。頭部是從一個叫做ExtendHeapSegment的函數返回的指針,它擴展了堆的大小並返回新的內存塊的頭部。我不確定這個塊的實際內容/後勤情況,但它來自任何內核進程擴展堆(不知道細節)。 – 2012-08-11 23:11:52

回答

0

您爲什麼認爲這應該起作用?除非指向的對象足夠大以至於添加payload + 4不會超出對象的大小,否則指針算術具有未定義的行爲。即使定義了算術(例如,如果對象大小正好是payload + 4),對數組末尾的槽1進行解引用也具有UB。您需要確保您傳遞的地址對象足夠大,以便代碼正常工作。

+0

啊,發現這個問題的其他地方。內存大小正確,但我們正在錯誤地處理標題塊的偏移量。謝謝。 – 2012-08-11 23:25:49

相關問題