Куча была повреждена, код срабатывает через раз
Написал такой код
#define _CRT_SECURE_NO_WARNINGS
#define FILE_NAME "cnfg.txt"
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char** delete_f;
} config;
void create(config* var, FILE* file)
{
var->delete_f = (char**)malloc(sizeof(char*));
char check[3];
int idx = 0;
while ((fscanf(file, "%c", &check[0])) == 1)
{
fseek(file, -1, SEEK_CUR);
var->delete_f = (char**)realloc(var->delete_f, idx + 3);
(var->delete_f)[idx++] = (char*)malloc(20);
fgets((var->delete_f)[idx - 1], 20, file);
}
}
int main()
{
config var;
var.delete_f = NULL;
FILE* file = fopen(FILE_NAME, "r");
create(&var, file);
return EXIT_SUCCESS;
}
Но работает, к сожалению, он только через раз. Насколько я понимаю все дело в realloc, потому что, когда я изначально задаю константную величину, работает все хорошо, как только меняю на realloc код начинает очень странно себя вести, то компилируется, то нет. Вылезает ошибка повреждена куча.
Ответы (1 шт):
Автор решения: Anton Shchyrov
→ Ссылка
Как есть
void create(config* var, FILE* file)
{
// выделили размер под один указатель char*
var->delete_f = (char**)malloc(sizeof(char*));
char check[3];
int idx = 0;
while ((fscanf(file, "%c", &check[0])) == 1)
{
fseek(file, -1, SEEK_CUR);
// перевыделили память под idx + 3 байт. Т.е. на первой итерации сюда
// даже не влезет один элемент char*
var->delete_f = (char**)realloc(var->delete_f, idx + 3);
// получили ошибку доступа
(var->delete_f)[idx++] = (char*)malloc(20);
fgets((var->delete_f)[idx - 1], 20, file);
}
}
Как должно быть
void create(config* var, FILE* file)
{
char check[3];
int idx = 0;
while ((fscanf(file, "%c", &check[0])) == 1)
{
fseek(file, -1, SEEK_CUR);
// перевыделили память под (idx + 1) элементов char*
var->delete_f = (char**)realloc(var->delete_f, (idx + 1) * sizeof(char*));
// для последнего элемента выделили 20 байт
(var->delete_f)[idx] = (char*)malloc(20);
fgets((var->delete_f)[idx], 20, file);
idx++
}
}
И по завершению программы нужно будет не забыть освободить всю выделенную память и закрыть файл