2011-11-02 48 views
0

這種錯誤的可能原因是什麼?正在寫入的文件沒有問題,但是每次都會失敗fwritefwrite失敗(返回0,perror給出「Bad address」)

我正在從32位小端移植到64位大端。

我寫的結構

struct Node 
{ 
uint8_t *a; 
uint32_t *b; 
uint32_t c; 
uint32_t d; 
uint32_t e; 
uint32_t f;  
uint32_t g; 
uint16_t h; 
uint8_t i; 
uint8_t j; 
uint8_t k[MAX]; 
uint32_t (*l)[2]; 
uint32_t m; 
uint32_t n; 

Node() { 
    memset(this, 0, sizeof(*this)); 
    l = NULL; 
    a = (uint8_t*)calloc(N,1); 
} 
~Node() { 
    free(a); 
    free(b); 
} 
}; 

寫節點的代碼

void push(void *ptr) 
{ 
Node *node = (Node *) ptr; 
assert(fwrite(node, sizeof(Node), 1, fpw) == 1); 
    free(node); 
} 

fpw具有全局範圍。

當我試圖調試時,我發現fwrite返回0,並且perror給出了「錯誤的地址」作爲錯誤。

任何建議,將不勝感激。

+0

顯示你在哪裏分配你傳遞給'push'的指針。 –

+0

在如此多的層次上這是錯誤的...... – littleadv

+0

@littleadv:在知道代碼的上下文和目的之前,絕對不應該說這是「正確」還是「錯誤」。考慮到字段名稱,字段類型和其他字段,我認爲這段代碼沒有什麼「真實」。這段代碼看起來像是爲實驗而做的實驗。你的「風格與設計」建議正在破壞實驗的目的。 – AnT

回答

1

我不知道我對你的答案在這裏,但我認爲它值得指出的一堆東西,我在你的代碼中看到。我希望解決它們會幫助你克服你的問題。

  1. 當你有一個類,你想轉儲到一個文件 - 讓這個類爲你做的工作。這意味着,您的Node類將有一個write/read集或operator<</operator>>或您將調用的任何其他常規例程集,並將其自身序列化爲文件,然後從讀取的文件中反序列化自身。 Boost也爲您提供幫助,以及tools

  2. 傾銷類指針的內容是一件危險的事情,尤其是如果你傾倒在一個架構,並閱讀其他(在你的情況32LE VS 64BE)。它會肯定失敗在一大堆各種不可預知的方式。

  3. 您訪問您從某處獲得的指針而未驗證其有效性。我不知道,如果你有你的ptr測試你叫push之前,但我敢肯定,這將有助於檢查指針push本身,特別是如果錯誤表明,它可能不是很好。

  4. 您正在編寫C++代碼。你在摧毀一個班級。 free不應該在您的代碼中的任何地方!您正在創建Node* nodemalloc?我希望不會!如果您使用的是new,則您的必須爲使用delete

  5. 您在~Node中免費使用ab,但您不會將它們分配到任何地方。如果你沒有在構造函數分配它 - 當你刪除它在析構函數 - 驗證您分配他們,否則你會得到一堆不確定的行爲也在這裏。

只是有些事情不由得注意,希望它有所幫助。

相關問題