Бесплатный неинициализированный указатель на C - PullRequest
0 голосов
/ 07 марта 2019

Если я динамически выделил место для указателя, перечислим это:

int *a = (int*)malloc(sizeof(int));

Должен ли я освободить a, когда код будет готов?Спасибо!

Ответы [ 4 ]

6 голосов
/ 07 марта 2019

Я думаю, у вас есть небольшое недоразумение, связанное с указателем.

Ваш заголовок гласит:

Бесплатный неинициализированный указатель ...

и ваш код

int *a = (int*)malloc(sizeof(int));

Проблема в том, что в коде нет неинициализированного указателя . Единственным указателем в коде является переменная a, и она равна , инициализированной значением, возвращаемым malloc.

Освобождение неинициализированного указателя было бы плохо - пример:

int *a;  // a is an uninitialized pointer

free(a);  // Real bad - don't do this

но так как вы фактически инициализируете указатель, тогда - Да, вы должны вызывать free, когда вы закончите, используя указатель объекта / памяти a, на который указывает. Неважно, было ли присвоено объекту, на который указывает указатель (ака, память), значение.

Общее правило: Для каждого звонка malloc должен быть звонок free

(Исключение: если ваша программа завершает работу, вам не нужно звонить free)

3 голосов
/ 07 марта 2019
int *a = malloc(sizeof(*a));
if (a) 
{
    /* a is now valid; use it: */
    *a = 1 + 2 + 3;
    printf("The value calculated is %d\n", *a);
}

/* Variable A is done being used; free the memory. */
free(a);  /* If a failed to be allocated, it is NULL, and this call is safe. */
0 голосов
/ 07 марта 2019
int *a = (int*)malloc(sizeof(int));

Должен ли я освободить, когда код готов?

Вопрос должен быть

Должен ли я освободить, когда код готов?

И ответ ДА.malloc должен сопровождаться оператором free.

free(a);
0 голосов
/ 07 марта 2019

Да.Если вы успешно используете malloc, то это правильно и для освобождения.

int *a = (int *) malloc(sizeof int);
if (a != NULL)
{
    /* Do whatever you need to do with a */
    free(a);
}
else
{
    puts("the malloc function failed to allocate an int");
}
...