2013-08-10 2 views
1

Если у вас есть указатель, который не инициализирован и, по ошибке, попробуйте его освободить, это приведет к неопределенному поведению?Вызывает ли освобождение неинициализированного указателя неопределенное поведение?

Как:

int main(void){ 

    char *string; 
    free(string); 

    return 0; 
} 
+3

Вы не «освободите указатель». Вы освобождаете * память *, и вы указываете, какую память вы хотите освободить с указателем на нее. –

ответ

4

ли освобождение неинициализированный результата указатель на неопределенное поведение?

Да.

Однако освобождение нулевого указателя является корректным.

От стандарта C99:

free функция заставляет пространство указывает ptr быть высвобождены, то есть, доступны для дальнейшего распределения. Если ptr является нулевым указателем, никаких действий не происходит. В противном случае, если аргумент не совпадает с указателем ранее возвращенная функцией calloc, malloc или realloc, или если пространство было высвобождено вызовом free или realloc, тем поведение не определен.

1

Да, это неопределенное поведение.

Указатель, переданный в free должен быть указатель на действительный объект, наделенного malloc, calloc, realloc или нулевой указатель.

От C99:.

(7.20.3.2p2) «Если PTR является нулевым указателем, никаких действий не происходит В противном случае, если аргумент не совпадает с указателем ранее возвращенное calloc, таНос, или realloc, или если пространство было освобождено вызовом free или realloc, поведение не определено ».

0

Да, это делает, так как вы должны только free() указатель, 1. является NULL или 2. Вы получили через вызов malloc(), calloc() или realloc().

2

Да, поскольку доступ к любой неинициализированная переменная провоцирует неопределенное поведение.

Включает передачу неинициализированного указателя по адресу free(). Это само по себе также включает случай, когда указатель uninitialise «случайно» может иметь значение, равное NULL.

Смежные вопросы