Я изо всех сил пытаюсь обернуть голову вокруг malloc в c - особенно, когда он должен быть свободным () 'd.Я получаю странные ошибки в gcc, такие как:
... free(): invalid next size (fast): ...
, когда я пытаюсь освободить указатель на символ.Например, при чтении из входного файла происходит сбой в определенных строках при выполнении следующих действий:
FILE *f = fopen(file,"r");
char x[256];
while(1) {
if(fgets(x,sizeof x,f)==NULL) break;
char *tmp = some_function_return_char_pointer(x); //OR malloc(nbytes);
// do some stuff
free(tmp); // this is where I get the error, but only sometimes
}
Я проверил очевидные вещи, например, если x равен NULL, но это не так;он просто падает на случайных строках.
Но мой РЕАЛЬНЫЙ вопрос - когда мне нужно использовать free () ?Или, возможно, более правильно, когда я не должен использовать бесплатно?Что если malloc находится в функции, и я возвращаю переменную, которая использовала malloc ()?Как насчет цикла for или while?Имеет ли malloc-ing для массива struct те же правила, что и для указателя строки / символа?
Я получаю из ошибок, которые я получаю в gcc при сбое программы, что я просто не понимаю malloc исвободно.Я провел свое качественное время с Google, и я все еще бью кирпичные стены.Есть ли хорошие ресурсы, которые вы нашли?Все, что я вижу, говорит о том, что всякий раз, когда я использую malloc, мне нужно использовать free.Но потом я пытаюсь это сделать, и моя программа падает.Так что, может быть, это отличается в зависимости от области видимости переменной?Освобождает ли C память в конце цикла, когда внутри нее объявлена переменная?В конце функции?
Итак:
for(i=0;i<100;i++) char *x=malloc(n); // no need to use free(x)?
но:
char *x;
for(i=0;i<100;i++) {
x=malloc(n);
free(x); //must do this, since scope of x greater than loop?
}
Это правильно?
Надеюсь, я делаючувство ...