Я читаю файл строки за строкой (файл содержит только одну строку для тестирования), и я создаю struct
для каждой строки и добавляя, что struct
к предопределенному массиву.double free при освобождении структуры в массиве
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
typedef struct {
int age;
int weight;
char *name;
} Person;
int person_create(Person **person, unsigned int age, unsigned int weight, char *name)
{
*person = malloc(sizeof(Person));
if (person == NULL) {
return 0;
}
return 1;
}
void person_free(Person *person)
{
free(person);
return;
}
int main(void)
{
FILE *input_file = NULL;
input_file = fopen("names.txt", "r");
assert(input_file != NULL);
char *line = NULL;
size_t _ = 0;
ssize_t line_len = 0;
Person persons[1] = {};
int line_num = 0;
while ((line_len = getline(&line, &_, input_file)) != -1) {
if (line[line_len - 1] == '\n') {
line[line_len - 1] = '\0';
}
Person *person = NULL;
person_create(&person, line_num, 2, line);
persons[line_num] = *person;
line_num++;
}
free(line);
printf("lines read %d\n", line_num);
for (int i = 0; i < 1; i++) {
person_free(&persons[i]);
}
return 0;
}
Я разделся программа вниз, насколько я мог, но на free'ing записи массива, я получаю ошибку
*** Error in `./prog': double free or corruption (out): 0x00007fff7ace9f10 ***
Aborted (core dumped)
Если я выхожу из вызова free_person
затем valgrind
отчетов утерянных Память.
Я уверен, что он должен делать с тем, как я назначить лицо для каждой строки массива
Person *person = NULL;
person_create(&person, line_num, 2, line);
persons[line_num] = *person;
Но я не могу понять, что именно происходит не так.
Хорошо, согласен.Это, конечно, только фиктивная программа, потому что я хочу узнать, как работать с динамическим распределением памяти, например, кто владеет памятью и кто несет ответственность за освобождение ... Я согласен с вашим мнением и полностью согласен. – Max
Argh ... спасибо: D – Max
Благодарим вас за то, что вы также указали на другие недостатки. У меня есть чему поучиться. – Max