Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么指针变量在释放后会存储以前存储的地址的新地址?_C_Malloc_Free_Dynamic Memory Allocation - Fatal编程技术网

C 为什么指针变量在释放后会存储以前存储的地址的新地址?

C 为什么指针变量在释放后会存储以前存储的地址的新地址?,c,malloc,free,dynamic-memory-allocation,C,Malloc,Free,Dynamic Memory Allocation,我有两个问题 在C语言中,free是如何工作的 指针变量如何更新自身以存储新地址 这是我的代码: #include <stdio.h> #include <stdlib.h> int main() { int a; int *p; p = (int *)malloc(sizeof(int)); *p = 10; int *q = p; printf("p:%d\n", p); printf("q:%d\n", q)

我有两个问题

  • 在C语言中,
    free
    是如何工作的
  • 指针变量如何更新自身以存储新地址
  • 这是我的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int a;
        int *p;
        p = (int *)malloc(sizeof(int));
        *p = 10;
        int *q = p;
        printf("p:%d\n", p);
        printf("q:%d\n", q);
        printf("*p:%d\n", *p);
        printf("*q:%d\n", *q);
        free(p);
        printf("Memory freed.\n");
        p = (int *)malloc(sizeof(int));
        *p = 19;
    
        printf("p:%d\n", p);
        printf("q:%d\n", q);
        printf("*p:%d\n", *p);
        printf("*q:%d\n", *q);
    }
    
    malloc()
    -ed指针上调用
    free()
    后,内存(返回的指针)可以通过对
    malloc()
    系列的任何后续调用重新分配。这就是拥有
    free()
    的全部意义所在

    引用第§7.22.3.3章中的
    C11

    free
    函数使
    ptr
    指向的空间被释放,即生成 可供进一步分配。[……]

    因此,很有可能在
    free()
    之后,当您
    malloc()
    为相同的指针重新加载相同的内存量时,返回相同的指针。这并不奇怪

    (谁知道呢,如果你的编译器足够聪明,它实际上可以删除无效的
    free(p);
    p=(int*)malloc(sizeof(int));

    接下来,在代码的最后一行

     printf("*q:%d\n", *q);
    
    您可以通过尝试访问(取消引用)已经空闲的d内存来调用。不要那样做

    也就是说

  • 要打印指针,应使用
    %p
    格式说明符并将参数强制转换为
    void*
  • malloc()

    q
    不会更新自身以存储
    p
    的新值。
    如果你删除了
    free(p)
    p=malloc(…
    之前,p将获得一个新地址,而
    q
    仍将保留旧地址。

    有两种未定义的行为。第一种是因为使用错误的格式打印指针,所以应该使用
    %p”
    打印指针。请参见,例如。第二个UB是因为在释放内存后取消引用
    q
    ,它指向这样的位置。不能保证您看到的行为会再次发生。一旦释放内存,就不能取消引用指向该内存的指针。输出为“像这样”因为这是您要求的内容(即,这是您的程序打印的内容)。请准确地指定您认为与您发布的内容不同的内容。顺便说一句,您的问题的标题没有任何意义。至于“指针变量更新自身以存储新地址”问题。它没有。您显式地执行
    p=malloc(…)
    这是整个“更新”对于变量。您所做的与例如
    int a=10;a=20;
    没有区别。据说您不需要强制转换malloc的返回值。最后,或任何其他返回
    void*
    的函数。也许您可以添加任何取消引用
    q
    的尝试都是UB,。。
     printf("*q:%d\n", *q);