2014-11-05 2 views
0

Почему я получаю ошибку времени выполнения, когда дело доходит до назначения x и y в следующей программе? Как я могу переписать allocate_node и main, чтобы предотвратить это?Почему эта программа на C встречает ошибку во время выполнения?

typedef struct 
{ 
    int x; 
    int y; 
} Foo; 

void allocate_node (Foo * f) 
{ 
f = (Foo *) malloc (sizeof(Foo)); 
} 
int main() 
{ 
    Foo * p; 
    allocate_node(p); 
    p->x = 2; 
    p->y = 3; 
    free(p); 
} 

ответ

3

allocate_node получает параметр по значению. Вместо этого попробуйте

void allocate_node (Foo ** f) 
{ 
    *f = (Foo *) malloc (sizeof(Foo)); 
} 

и

Foo * p; 
allocate_node(&p); 

Или просто

Foo * p = (Foo *) malloc (sizeof(Foo)); 
p->x = 2; 
p->y = 3; 
free(p); 
+0

'* f = malloc (sizeof (Foo));' – mch

+0

@mch Спасибо, исправлено. – AlexD

2

Другие ответы уже указывали на проблему и как ее исправить. Мое предложение состоит в том, чтобы изменить функцию таким образом, чтобы ее использование было более естественным.

Вместо

void allocate_node (Foo ** f); 

использования

Foo* allocate_node(); 

Затем вы можете использовать:

Foo* allocate_node() 
{ 
    return (Foo*)malloc(sizeof(Foo)); 
} 

int main() 
{ 
    Foo* p = allocate_node(); 
    p->x = 2; 
    p->y = 3; 
    free(p); 
} 

Я хотел бы пойти дальше и рекомендовать создание функции для освобождения в Foo* быть последовательным с понятием, что каждое распределение должно иметь освобождение и функции для выделения и освобождения должны попадать парами. Кроме того, назовите функции allocate_foo и deallocate_foo, чтобы убедиться, что по мере роста вашей программы у вас есть возможность создавать другие функции allocate_xxx и deallocate_xxx для других объектов (спасибо @ gnasher729 за предложение).

Foo* allocate_foo() 
{ 
    return (Foo*)malloc(sizeof(Foo)); 
} 

void deallocate_foo(Foo* node) 
{ 
    free(node); 
} 

int main() 
{ 
    Foo* p = allocate_foo(); 
    p->x = 2; 
    p->y = 3; 
    deallocate_foo(p); 
} 
+1

Я бы назвал их allocate_foo и deallocate_foo, потому что, как только программа станет больше, вы захотите выделить разные вещи. – gnasher729

+0

@ gnasher729, хорошее предложение. –

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