Предоставляет ли следующий код освобожденную память для 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
.