2014-05-17 4 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 
} 

Что нужно изменить, чтобы заставить его работать? Это gcc на Linux.

+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). –

Смежные вопросы