Я новичок в написании в c, . Моя программа предназначена для разбора файла txt и сохранения первого слова в структуре с именем «Файл».Получение «free(): invalid pointer» in c
для exmple: для текстовый файл, содержащий: file1: file2, file3 file66: file7
я хотел бы сохранить file1 и file2 в структуры при file1-> имя = file1 fiel1 -> отношение = [файл2, файл3]
, но это только для небольшого изучения программы.
проблема: , потому что я не знаю размер массива символов, которая представляла бы имя я пытался использовать динамическую память с помощью таНоса и свободной в процессе я использую strtok для синтаксического анализа части проблема начинается в 4 последних строках (помечены в комментарии) , и я продолжаю получать ошибку «free(): неверный указатель: 0x00007ffe6accfdd0 ***» (я смотрел на веб-сайте ответы, но я из-за отсутствия понимания в указатель мне было трудно понять идею проблемы).
Кто-то может объяснить мне почему? спасибо от заранее
typedef struct File
{
char *name;
int *relation;
}File;
char *error = BAD_FILE_MSG;
char buffer[MAX_LEN_SIZE];//the file buffer
if (argc != RIGHT_NUM_OF_PARAM) {
fprintf(stderr, UNVALID_PARAMETER_MSG);
return BAD_RET_VAL;
}
char *fileName = argv[1];
FILE *fp = fopen(argv[1], "r"); /* "r" = open for reading */
if (fp == NULL)
{
fprintf(stderr, "%s %s", error, fileName);
return BAD_RET_VAL;
}
if (ferror(fp) != 0)
{
fprintf(stderr, "%s %s", error, fileName);
return BAD_RET_VAL;
}
//int line = 0;//todo magic
while (fgets (buffer, sizeof(buffer), fp))
{
/**
* saving all the line in a char[]
*/
//give memory to an array in file
char *token;
token = strtok (buffer, SIGN_FOR_SEPARATE);
int marker = 0;//todo fix
//creating a struct of a file
File* fileStruct = (File*)malloc(sizeof(File));
//creating a dynamic array of ints for relation
fileStruct->relation = (int *)malloc(100 * sizeof(int));//todo free your mind
char file[100];
while (token != NULL)
{
if (marker == 0)
{
char* pointer = fileStruct->name;
size_t size = strlen(token);
//creating a dynamic array of chars for name
fileStruct->name = (char *)malloc(size + 1);
fileStruct->name = token;//**getting the error**
free(pointer);
marker++;
}
Пожалуйста, создайте [минимальный тестовый пример] (http://stackoverflow.com/help/mcve). –
'Файл * fileStruct = (Файл *) malloc (sizeof (Файл)); [...] char * pointer = fileStruct-> name; [...] бесплатно (указатель); 'Неопределенное поведение для использования объекта с автоматической продолжительностью хранения, пока его значение не определено. – EOF
Вы выделяете память 'fileStruct-> name', а затем переписываете это значение указателей после. Это утечка памяти, если ничего другого.Аналогично, 'pointer' отражает значение' fileStruct-> name' до того, как его значение будет перезаписано вызовом malloc. У вас здесь много проблем. – mathematician1975