Да, вам не нужен malloc в основном, так как он сразу же перезаписывается на следующей строке и вы пропускаете эту память. Это вопрос домашнего задания?
EDIT для вопроса изменить
Это теперь утечка памяти странным образом.
Первые несколько строк не протекают, но когда вы попадаете в цикл, который вы произвольно распределяете и назначаете. (В качестве первого, перераспределить принимает, как это первый arguement указатель перераспределить, поэтому вам не хватает ptr
там)
Теперь вы выделения ptr
быть размером 2, затем 3, затем 4 и т.д. ... вверх до 6. а потом сразу течь, что память, как вы перезаписать указатель с вызовом f()
вы могли бы написать, что все так:
int i;
int **ptr = malloc (sizeof(int*) * 6);
for (i = 0; i < 6; ++i)
{
ptr[i] = f(i);
}
for (i = 0; i < 6; ++i)
{
printf ("%d\n", *ptr[i]);
free (ptr[i]);
}
free (ptr);
return 0;
как и в сторону, вы должны вообще стараться не выделять память слишком часто, это относительно медленно. Если вы можете использовать стек, вы должны, а если нет, попробуйте и выделите всю необходимую вам память, вызов realloc в цикле - плохая идея, и ее следует избегать.
В этом конкретном случае вам не нужен указатель на указатель, вы могли бы просто выделить один массив из 6 целых чисел, с int* array = malloc(sizeof(int) * 6)
, а затем array[0] = 0;
, который будет проще и лучше.
Да, и это также утечки памяти. –
Я предполагаю, что здесь есть учебная (домашняя работа), но «valgrind --leak-check = full» может помочь здесь красиво (скомпилируйте свою программу с информацией об отладке, чтобы получить номера строк, где вы можете пропустить память). Заметьте, кстати, что ваша текущая версия программы не будет компилироваться. – Evert
Что ты думаешь? И почему? –