【问题标题】:Does freeing an uninitialized pointer result in undefined behavior?释放未初始化的指针会导致未定义的行为吗?
【发布时间】:2013-08-12 05:12:45
【问题描述】:

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

喜欢:

int main(void){

    char *string;
    free(string);

    return 0;
}

【问题讨论】:

  • 您不会“释放指针”。您释放了内存,并使用指向它的指针指示要释放的内存。

标签: c pointers free


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    是的,确实如此,因为您应该只在 free() 一个指针,即 1. 是 NULL 或 2. 您通过调用 malloc()calloc()realloc() 获得。

    【讨论】:

      【解决方案3】:

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

      传递给free 的指针应该是指向分配有malloccallocrealloc 或空指针的有效对象的指针。

      来自 C99:

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

      【讨论】:

        【解决方案4】:

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

        是的。

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

        来自 C99 标准:

        free 函数使ptr 指向的空间被释放,也就是说,可用于进一步分配。如果ptr 是空指针,则不会发生任何操作。否则,如果参数与callocmallocrealloc 函数,或者如果空间已通过调用 freerealloc 释放,则行为未定义

        【讨论】:

          猜你喜欢
          • 2015-04-19
          • 1970-01-01
          • 1970-01-01
          • 2019-12-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多