2015-02-16 2 views
1

Я имел эту строку кода:собственно таНос ошибка фиксации

conf->table = malloc(sizeof(struct Categorie)*(csv_nbLines(filename))); 

, что привело к ошибке при вызове free() на conf, потому что struct Categorie включать строку (массив char с).

Я исправил ошибку, заменив sizeof(struct Categorie) на 30, потому что я знаю, что указанная строка не будет содержать более 30 байт.

Это приемлемо? Если бы не то, что было бы лучшим способом для malloc точного объема памяти?

EDIT:

struct Categorie { 
    char *name; 
    char c; 
}; 

EDIT2:

Я заканчиваю с этим, и он прекрасно работает (названия говорят сами за себя).

в conf_init()

conf->table = malloc(sizeof(struct Categorie)) 

в conf_load() где pch является строка, возвращаемая strtok()

conf->table[i].name = malloc(sizeof(char)*strlen(pch)); 
conf->table[i].name = pch; 

Я надеюсь, что это достаточно объяснение для следующего одного :)

+0

вы можете попробовать 'free (conf-> table)' вместо этого. – Ishmeet

+2

Пожалуйста, покажите определение 'Categorie'; возможно, что ваше исправление не связано с реальной проблемой. – Codor

+1

RE: Обновление: 1) Сделать это 'conf-> table [i] .name = malloc (1 + strlen (pch));' [sizeof (char) равно 1, по определению дополнительный символ необходим для завершения NUL] 2) 'conf-> table [i].name = pch; 'Вы не можете скопировать строки по назначению, используйте strcpy() или memcpy() или, в этом случае strdup() – joop

ответ

4

я боюсь , NO.

Предполагая строку вы упомянули в виде

struct Categorie 
{ 

. 
. 
char * str; 
} 

Вы должны первым malloc() памяти для conf->table с sizeof(struct Categorie), а затем, malloc() для conf->table->str.

Не говоря уже, free() ИНГ также требуется, в точном противоположном oreder распределения, то есть, сначала нужно освободить conf->table->str, а затем conf->table.

+0

Спасибо, человек, очень полезен! – kinezana

+0

@kinezana Добро пожаловать. :-) –

1

Нет. Это неприемлемо.

Вам необходимо предоставить больше кода, чтобы понять, что происходит, но при условии, что conf->table - struct Categorie *, тогда есть что-то довольно гнилое.

Если это не тот тип, то непонятно, почему вы когда-либо думали, что sizeof(struct Categorie) может быть ответом.

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