Подтвердить что ты не робот

Бесплатный назначенный указатель

Предоставляет ли следующий код освобожденную память для x?

int main()
{
    char *x = (char*)calloc(100, sizeof(char));
    char *y = x;
    free(y);
}
4b9b3361

Ответ 1

Да

Когда вы делаете

char *y = x;

вы делаете y указываете на место, где указывает x. Поскольку y указывает на ячейку памяти, возвращаемую calloc,

free(y);

отлично. Поскольку @haccks прокомментировал, это не сработает, если вы сделаете y указателем на другую ячейку памяти, предоставленную что это место памяти не было возвращено malloc/calloc/realloc.


В C вы не должны отличать результат malloc/calloc/realloc. Кроме того, проверка возвращаемого значения calloc, чтобы убедиться, что он был успешным, хорош. calloc вернет NULL при сбое.

Ответ 2

Исходная версия вопроса имела

int *y = x;
free(y);

т.е. присваивая указателю char указателю int, а затем вызывает free() в указателе int. Подпись free() void free(void *ptr);, поэтому независимо от char * и int *, память будет выпущена.

Измененная (и текущая) версия вопроса имеет

char *y = x;
free(y);

Здесь оба y и x указывают на одну и ту же память. Это называется псевдонимом указателя. После вызова free() эта память, безусловно, будет выпущена.

Однако проблема заключается в том, что после free(y) указатель x будет свисать, т.е. память, на которую он указывает, уже недействительна.

Обратите внимание, что не нужно и не рекомендуется указывать возвращаемое значение из calloc.

Ответ 3

Да, это так.

Метод void free(void *ptr), тогда при создании char* y = x у вас есть указатель на ту же память пространства, на которую указывал y.

Это позволит вам освободить это пространство позже с помощью free (y).

Однако вы бы поставили x = NULL, потому что теперь x не имеет собственного пространства, несмотря на то, что оно имеет значение.

Для получения дополнительной информации о бесплатном чтении здесь.

Ответ 4

Память, возвращаемая вашим вызовом calloc(), освобождается вызовом free().

В коде, который влияет как на x, так и на y.