3
int main()
{
    int *ptr, **ptr1;
    ptr = (int*)malloc(sizeof(int));
    ptr1 = (int**)malloc(sizeof(int));
    free(ptr);
    *ptr = 12345;
    ptr1 = &ptr;

    //free(ptr);
    //**ptr1 = 23456;
    printf("%d \n", **ptr1);
    system("pause");
    return 0;
}

当内存已经存在时,如何*ptr存储值?所以,现在 应该指向. 为什么会这样?12345freedptrgarbage

4

5 回答 5

8

这段代码在很多层面上都是非常错误的。

  1. 不要malloc()C中转换返回值。
  2. 您分配了错误的尺寸;ptr1需要sizeof *ptr1,没有sizeof (int)。是指针!
  3. 请记住,这malloc()可能会失败。使用前检查返回值。
  4. 完成后不要(只是不要)访问内存free()。未定义的行为。

另外,请注意,当您调用它时,指针本身free()并没有被破坏;消失的是指针所指的内存。因此,如果您愿意,您仍然可以将指针的位值存储在指针本身中。但是,很少有需要这样做的情况,并且在/如果您检查这些位时应小心。

于 2012-09-06T09:12:57.117 回答
4

指针被释放,但它仍然指向它在分配时所做的任何事情。这样做被认为是严重的编程错误。但是运行时环境(通常)不会帮助识别或纠正此类错误。

不要将枪指向自己并扣动扳机!

于 2012-09-06T09:13:06.017 回答
3

That's undefined behavior, anything can happen.

free(ptr);
*ptr = 12345;

Is illegal. It can crash or, if you're unlucky, it can appear to work, potentially hiding the problem until the software is shipped to a nuclear power plant. Although, if you're writing code like this, you're probably not working for such companies. :)

于 2012-09-06T09:10:43.577 回答
1

您似乎不了解未定义的行为。基本上,行为是未定义的。它可以做任何事情,包括(但不限于)以下内容:

  1. 碰撞
  2. 做你错误地期望它做的事情
  3. 做你告诉它做的事,但不会产生错误
  4. 在您的控制台上开始俄罗斯方块游戏
  5. 重新格式化你的硬盘

通常(在大多数系统上)访问释放的内存可能看起来好像它已经工作了,同时随机破坏程序的其他部分认为它拥有的数据(取决于释放后是否有分配)。

试图定义未定义的行为会让你一无所获。最好不要一开始就这样做。

于 2012-09-06T09:36:48.350 回答
0

free() 释放 *ptr 指向的内存,但不会更改 *ptr 的值,因此如果该值不与其他任何内容冲突,它仍然可以工作,但内存可能由另一个进程随机分配。常见的做法是做free(ptr);ptr = NULL 以避免在没有另一个 malloc 调用的情况下意外重用内存。

于 2012-09-06T09:20:01.870 回答