2014-05-17 51 views
-1

我不明白是什麼導致內存訪問錯誤在這裏。這是什麼導致內存訪問錯誤?

我做了這個簡單的例子,這說明我的問題:

#include <stdlib.h> 

typedef struct mycanvas { 
    void *pixels; 
} mycanvas; 

main() 
{ 
    void* testchunk; 
    testchunk = (void*) calloc (1024 * 768 * 4,sizeof(char)); 

    struct mycanvas* new_canvas; 
    new_canvas->pixels=testchunk; //causes memory access error 
} 

什麼需要改變,以得到它的運行?這是Linux上的gcc。

+2

什麼是'new_canvas'指向? –

+3

這不會編譯爲C++。你確定你不用C編碼嗎? – Mat

+0

我強烈建議你使用'main'作爲返回一個整數的函數,如:'int main(void)'... –

回答

0
#include <stdlib.h> 

typedef struct mycanvas { 
    void *pixels; 
} mycanvas; 

int main() 
{ 
    void* testchunk; 
    testchunk = (void*) calloc (1024 * 768 * 4,sizeof(char)); 

    mycanvas *new_canvas = malloc(sizeof(struct mycanvas)); 
    new_canvas->pixels=testchunk; //now everything is ok 

return 0; 
} 
3

您從未初始化new_canvas。最有可能的,你想這樣做:

struct mycanvas new_canvas; 
new_canvas.pixels=testchunk; 
+0

我想我可以用下面的語句初始化它: 「struct mycanvas * new_canvas;」 這使得new_canvas成爲一個指針,因此下一條語句 是: 「new_canvas-> pixels = testchunk;」 – Georg

+3

@Georg製作一個指針是不夠的。在使用它指向的內容之前,你必須將它指向某個有效的地方。 – mah

-1

我想我想通了現在:

#include <stdlib.h> 

typedef struct mycanvas { 
    void *pixels; 
} mycanvas; 

main(){ 
    void* testchunk; 
    testchunk = (void*) calloc (1024 * 768 * 4,sizeof(char)); 

    struct mycanvas* new_canvas=(mycanvas*)malloc(sizeof(mycanvas)); 

    new_canvas->pixels=testchunk; 
} 

謝謝您的幫助!順便說一下,因爲我使用CPP,我可以使用「新」而不是malloc。

+0

這比'struct mycanvas new_canvas; struct mycanvas * new_canvas2 =&new_canvas;'。在這個版本中,你必須事後「釋放」,但是在那個版本中你沒有。 –

+0

這段代碼在C++中是非法的,因爲你沒有聲明'main'的返回類型。你也在最初的帖子中說過你使用gcc(而不是g ++)。 –

+0

你很清楚*不*使用C +。如果你是的話,你會包含'',你不會輸入結構,你不需要在變量聲明中使用struct,你不需要將'malloc'和'calloc ',你需要一個'main'的返回類型,可能還有更多我缺少的東西。你很清楚地編寫C代碼。如果你希望編寫C++,那麼你就錯了。絕對拿起[關於語言的好書](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 –