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