неспособность освободить мэллока

#arrays #c #malloc #dynamic-memory-allocation #free

Вопрос:

я создал массив указателей, каждый из которых указывает на структуру:

 curr = (line_packet*)malloc(sizeof(line_packet)); //line packet is the struct
array = (line_packet*)malloc(sizeof(line_packet*) * counter_lines); //counter_lines the number of curr structs i created.
 

и каждый раз, когда я помещаю карр в массив, я использую эту строку:

 array[i] = *curr;
 

затем в конце кода я помещаю это:

 for (i = 0; i < counter_lines; i  )
{
    free(amp;array[i]);
}
free(array);
 

но, похоже, программе не удается освободить память.
что мне делать?
Спасибо!

Комментарии:

1. Вы, вероятно, хотите измениться *curr на curr и amp;array[i] на array[i] .

2. Это amp; опечатка? Если нет, то это источник проблемы.

3. free(amp;array[i]); это гарантированный рецепт катастрофы. И опрометчивые оценки ваших распределений тоже не имеют большого смысла. Если вы выделяете counter_lines последовательность указателей на line_packet, зачем приводить результат к указателю на line_packet. Во всяком случае, это будет указатель на указатель на линейный пакет. Одно это говорит мне о том, что таинственный тип array (не показан), скорее всего, неверен, и у него довольно сильный аромат кода. Если line_packet это фиксировано (нет гибкого элемента), то для начала нет смысла использовать несколько уровней косвенности.

Ответ №1:

Есть несколько ошибок.

Для начала в этом заявлении

 array = (line_packet*)malloc(sizeof(line_packet*) * counter_lines);
 

вы выделили массив указателей типа line_packet* и интерпретировали возвращенный указатель как указатель типа line_packet * вместо line_packet ** .

Вам нужно написать хотя бы так

 array = (line_packet**)malloc(sizeof(line_packet*) * counter_lines);
 

при условии, что указатель array имеет тип line_packet ** .

Так что вы можете не писать

 array[i] = *curr;
 

потому что выражение *curr не является указателем.

В результате этого заявления

 free(amp;array[i]);
 

в цикле for

 for (i = 0; i < counter_lines; i  )
{
    free(amp;array[i]);
}
free(array);
 

в этом нет никакого смысла.

Вам нужно написать хотя бы так

 array[i] = malloc( sizeof( line_packet ) );

*array[i] = *curr;
 

В данном случае этот цикл

 for (i = 0; i < counter_lines; i  )
{
    free(array[i]);
}
free(array);
 

будет правильным при условии, что каждый элемент массива указывает либо на динамически выделяемую память, либо на нулевой указатель.

Или вместо массива указателей вы могли бы выделить массив объектов данного типа line_packet .

 array = malloc(sizeof(line_packet) * counter_lines);
 

В данном случае это утверждение

 array[i] = *curr;
 

будет правильно.

Однако цикл

 for (i = 0; i < counter_lines; i  )
{
    free(amp;array[i]);
}
 

должны быть удалены.