#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]);
}
должны быть удалены.