3

如果您有一个未初始化的指针,并且错误地尝试释放它,这会导致未定义的行为吗?

喜欢:

int main(void){

    char *string;
    free(string);

    return 0;
}
4

4 回答 4

5

释放未初始化的指针会导致未定义的行为吗?

是的。

但是,释放空指针是明确定义的。

来自 C99 标准:

free函数使 所指向的空间ptr被释放,也就是说,可用于进一步分配。如果ptr是空指针,则不执行任何操作。calloc否则,如果参数与先前由、malloc或 函数返回的指针不匹配realloc,或者如果空间已通过调用freeor被释放realloc,则行为未定义

于 2013-08-10T09:59:20.047 回答
2

是的,因为访问任何未初始化的变量都会引发未定义的行为。

这包括将未初始化指针传递给free(). 这本身还包括未初始化指针“意外”可能具有等于的值的情况NULL

于 2013-08-10T10:36:55.837 回答
1

是的,这是未定义的行为。

传递给的指针free应该是指向用 、 或空指针分配的有效对象malloccalloc指针realloc

从 C99 开始:

(7.20.3.2p2) “如果 ptr 是空指针,则不会发生任何操作。否则,如果参数与 calloc、malloc 或 realloc 函数先前返回的指针不匹配,或者如果空间已被调用释放释放或重新分配,行为未定义。”

于 2013-08-10T09:59:24.333 回答
0

是的,确实如此,因为您应该只使用 1.或 2. 您通过调用,或获得free()的指针。NULLmalloc()calloc()realloc()

于 2013-08-10T09:59:39.340 回答