【发布时间】:2013-08-12 05:12:45
【问题描述】:
如果您有一个未初始化的指针,并且错误地尝试释放它,这会导致未定义的行为吗?
喜欢:
int main(void){
char *string;
free(string);
return 0;
}
【问题讨论】:
-
您不会“释放指针”。您释放了内存,并使用指向它的指针指示要释放的内存。
如果您有一个未初始化的指针,并且错误地尝试释放它,这会导致未定义的行为吗?
喜欢:
int main(void){
char *string;
free(string);
return 0;
}
【问题讨论】:
是的,因为访问 any 未初始化的变量会引发未定义的行为。
这包括将未初始化指针传递给free()。这本身还包括未初始化指针“意外”可能具有等于NULL 的值的情况。
【讨论】:
是的,确实如此,因为您应该只在 free() 一个指针,即 1. 是 NULL 或 2. 您通过调用 malloc()、calloc() 或 realloc() 获得。
【讨论】:
是的,这是未定义的行为。
传递给free 的指针应该是指向分配有malloc、calloc、realloc 或空指针的有效对象的指针。
来自 C99:
(7.20.3.2p2) "如果 ptr 是空指针,则不执行任何操作。否则,如果参数与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已被释放通过调用 free 或 realloc,行为是未定义的。”
【讨论】:
释放未初始化的指针会导致未定义的行为吗?
是的。
但是,释放空指针是明确定义的。
来自 C99 标准:
free函数使ptr指向的空间被释放,也就是说,可用于进一步分配。如果ptr是空指针,则不会发生任何操作。否则,如果参数与calloc、malloc或realloc函数,或者如果空间已通过调用free或realloc释放,则行为未定义。
【讨论】: