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