Начальные:C ошибка двойного освобождения
создание динамического массива структуры данных, называемой дробями. Фракции имеют функции для настройки, печати, подсказки и т. Д.
Я продолжал получать ошибку за двойное освобождение или повреждение, а также много тарабарщины с карты памяти. Это ошибка с выхода:
двойной бесплатно или повреждение (сверху): 0x0000000001976010 *
Я понимаю, что она будет освобождена/удалены два раза, но вот код, который генерирует сообщение об ошибке:
#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
long long int size = 0;
long long int capacity = 10;
int FSize = sizeof(struct fraction);
struct fraction* array = NULL;
struct fraction in;
array = (struct fraction*)malloc(FSize * capacity);
if (array == NULL) {
printf("MALLOC DID NOT WORK\n");
exit(1);
}
int i = 0;
for (i = 0; i < 17; i++) {
if (size == capacity) {
capacity = capacity * 2;
struct fraction* temp = NULL;
temp = (struct fraction*)realloc(array, FSize * capacity);
// free(array);
array = temp;
free(temp);
}
SetFrac(&in);
array[size++] = in;
}
printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> \n");
getchar();
for (i = 0; i < size; i++) {
struct fraction t = array[i];
PrintFrac(&t);
}
free(array);
return 0;
}
Вот код, который работает
#include <stdio.h>
#include <stdlib.h>
#include "fraction.h"
main() {
long long int size = 0;
long long int capacity = 10;
int FSize = sizeof(struct fraction);
struct fraction* array = NULL;
struct fraction in;
array = (struct fraction*)malloc(FSize * capacity);
if (array == NULL) {
printf("MALLOC DID NOT WORK\n");
exit(1);
}
int i = 0;
for (i = 0; i < 17; i++) {
if (size == capacity) {
capacity = capacity * 2;
struct fraction* temp = NULL;
temp = (struct fraction*)realloc(array, FSize * capacity);
// free(array);
array = temp;
free(temp);
}
SetFrac(&in);
array[size++] = in;
}
printf("IT MADE IT HERE >>>>>>>>>>>>>>>>>> \n");
getchar();
for (i = 0; i < size; i++) {
struct fraction t = array[i];
PrintFrac(&t);
}
// free(array);
return 0;
}
Я использую функцию free() неправильно?
Вы назначаете 'массив = temp', затем освобождая 'temp'. Поскольку 'array' - это одно и то же значение, вы также освободили, по сути,' array'. Но затем вы переходите к использованию 'array' после того, как он был освобожден, что плохо. Почему вы освобождаете его сразу после получения «realloc»? – lurker