将内存重新分配为空引用

问题描述

我正在观看malloc上的一堂课,而当他们在做一个具体的例子时,为什么这样的代码能打印出整个指针毫无意义。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    
    int *list = malloc(3 * sizeof(int));
    
    if (list == NULL)
        return 1;
        
    list[0] = 1;
    list[1] = 2;
    list[2] = 3;
    
    int *tmp = malloc(4 * sizeof(int));
    
    if (tmp == NULL)
        return 1;
        
    for (int i = 0; i < 3; i++)
        tmp[i] = list[i];
        
    tmp[3] = 4;
    
    free(list);

    //From this line and below is the thing in question.
    list = tmp;
    
    for (int i = 0; i < 4; i++)
        printf("%i\n",list[i]);
}

输出

~/test/ $ ./malloc_test
1
2
3
4

据我对free()的理解,它会取消分配函数分配的内存,而free()将“释放”指针的内存。

如果我按照这个定义:

  1. *list被分配了12个字节(3 * sizeof(int)sizeof(int) = 4
  2. 带有数字的硬编码list
  3. *tmp被分配了16个字节
  4. list中的数字复制到tmp
  5. 释放列表,使其没有分配的字节数
  6. 列表现在等于tmp
  • list没有分配的内存时,tmp现在等于list吗?

  • list是否指向tmp的地址?如果是的话,为什么自代码前面的步骤以来我们不需要为list分配内存,我们做了int *tmp = malloc(4 * sizeof(int));

解决方法

*list被分配了12个字节(3 * sizeof(int),sizeof(int)= 4

准确地说,您分配了12个字节的内存,并将list设置为指向该内存。

带有数字的硬编码list
*tmp被分配了16个字节

准确地说,您再次分配了16个字节的内存,并将指针变量tmp设置为指向它。

list中的数字复制到tmp
释放list,使其没有分配的字节数

确切地说,您释放了list指向的对象,因此现在list指向垃圾并且不能被取消引用。

list现在等于tmp

确切地说,list现在指向tmp指向的同一对象,您分配的先前的16个字节仅由tmp指向。

当列表没有分配的内存时,list现在如何等于tmp

以前,list没有指向已分配的内存。但是您将其更改为指向您每秒分配的16个字节。指针的值就是它所指向的值,listtmp现在指向相同的事物,因此它们具有相同的值。因此,它们现在相等。

列表是否指向tmp的地址?如果是,为什么我们从代码的前面就不需要为列表分配内存,我们这样做是int * tmp = malloc(4 * sizeof(int));

该代码释放第一个分配的内存块。如果它不分配第二个内存块,则任何指针指向的都将无效!

,

复制指针时,您只是复制指针的值 1

base-api

这意味着banana cake apple ... 现在包含list = tmp; 指针的副本,或者换句话说,它们都指向相同的内存地址。在这种情况下,该地址就是分配。

一旦它们完全相同,您就可以互换引用它们。


1 当然,这假定指针的类型相同,例如listtmp,而不是int*int*。您还可以将其分配给int,然后稍后再转换回去,效果也很好。

,

指针是一种数据类型,仅分配了相应数据类型的内存地址,在list = tmp;中,您分配了用int * tmp = malloc (4 * sizeof (int)); 创建的那个内存块的第一个位置,当您进行分配以列出它将指向该内存地址。 (在您的情况下,该内存块的开头)。