2016-08-10 6 views
-6

Я новичок в написании в 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++; 
     } 
+2

Пожалуйста, создайте [минимальный тестовый пример] (http://stackoverflow.com/help/mcve). –

+1

'Файл * fileStruct = (Файл *) malloc (sizeof (Файл)); [...] char * pointer = fileStruct-> name; [...] бесплатно (указатель); 'Неопределенное поведение для использования объекта с автоматической продолжительностью хранения, пока его значение не определено. – EOF

+1

Вы выделяете память 'fileStruct-> name', а затем переписываете это значение указателей после. Это утечка памяти, если ничего другого.Аналогично, 'pointer' отражает значение' fileStruct-> name' до того, как его значение будет перезаписано вызовом malloc. У вас здесь много проблем. – mathematician1975

ответ

0

Я просто хочу, чтобы сосредоточиться на том, что причиной вашей ошибки (я не читал большую часть вашего кода).

Указатели - одна из концепций в C, которые занимают много времени, чтобы учиться, и вам предстоит пройти долгий путь.
Указатель - это просто адрес в памяти, ничего больше. Вы можете думать о *pointer как о вызове функции, который говорит: «Возьмите номер, хранящийся в указателе, выйдите в память и верните значение, которое вы найдете по адресу, соответствующему этому номеру».


Когда вы говорите:

char* pointer = fileStruct->name; 

Вы не подключаете эти две переменные в любом случае. Было бы, как говорят:

int foo = 3; 
int bar = foo; 

Теперь они имеют то же значение, но если вы измените Foo, Bar не меняется.

В вашем коде вы на самом деле не используете указатель в любом месте, поэтому вы можете просто избавиться от него и вызвать free(fileStruct->name), когда вы закончите использовать его.


Это, как говорится, вам нужно больше практики/чтения/изучения того, как работают указатели. Если вы только начинаете программировать в целом, вам может понадобиться избегать указателей, пока вы не будете довольны основами.

+0

thnx man, я знаю java и python, но c - это новый мир для меня, и я пытался научиться в нем через несколько дней, я никогда не видел программу в неделю назад .... не видел, как это происходит ... ее nothong, как java, и позволяет даже не мантион python ... Я пытаюсь использовать указатель, чтобы учиться в трудном ключе, потому что я всегда научился делать что-то, я могу видеть силу в c, но мне нужно отпустить мои java \ python habbits. в любом случае я возвращаюсь к книгам \ youtube ... –

+0

У многих людей проблемы с указателями. Держись, и удачи! – Riley

+0

thnx man..i will! –