Предоставляет ли следующий код освобожденную память для x?
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Предоставляет ли следующий код освобожденную память для x?
int main()
{
char *x = (char*)calloc(100, sizeof(char));
char *y = x;
free(y);
}
Да
Когда вы делаете
char *y = x;
вы делаете y указываете на место, где указывает x. Поскольку y указывает на ячейку памяти, возвращаемую calloc,
free(y);
отлично. Поскольку @haccks прокомментировал, это не сработает, если вы сделаете y указателем на другую ячейку памяти, предоставленную что это место памяти не было возвращено malloc/calloc/realloc.
В C вы не должны отличать результат malloc/calloc/realloc. Кроме того, проверка возвращаемого значения calloc, чтобы убедиться, что он был успешным, хорош. calloc вернет NULL при сбое.
Исходная версия вопроса имела
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.
Да, это так.
Метод void free(void *ptr), тогда при создании char* y = x у вас есть указатель на ту же память пространства, на которую указывал y.
Это позволит вам освободить это пространство позже с помощью free (y).
Однако вы бы поставили x = NULL, потому что теперь x не имеет собственного пространства, несмотря на то, что оно имеет значение.
Для получения дополнительной информации о бесплатном чтении здесь.
Память, возвращаемая вашим вызовом calloc(), освобождается вызовом free().
В коде, который влияет как на x, так и на y.