gpt4 book ai didi

c - 将内存重新分配到空引用

转载 作者:行者123 更新时间:2023-12-03 21:48:44 25 4
gpt4 key购买 nike

我正在观看 malloc 的类(class)当他们在做一个具体的例子时,为什么这样的代码打印出整个指针是没有意义的。

#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()将“释放”指针的内存。
如果我按照这个定义去:
  • *list分配了 12 个字节 (3 * sizeof(int) , sizeof(int) = 4
  • 硬码 list带数字
  • *tmp分配了 16 个字节
  • 复制 list 中的数字至tmp
  • 释放列表使其没有分配的字节
  • 列表现在等于 tmp
  • 怎么可能list现在等于 tmplist没有任何分配的内存?
  • list指向tmp的地址?如果是,为什么我们不需要为 list 分配内存?由于在代码的前面,我们这样做了int *tmp = malloc(4 * sizeof(int));
  • 最佳答案

    *list was allocated 12 bytes (3 * sizeof(int), sizeof(int) = 4


    准确地说,您分配了 12 字节的内存并设置了 list指向那段内存。

    Hard code list with numbers
    *tmp was allocated 16 bytes


    同样,准确地说,您分配了 16 字节的内存并设置了指针变量 tmp指向它。

    Copy the numbers in list to tmp
    Free up list making it have no allocated bytes


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

    list is now equal to tmp


    准确地说, list现在指向相同的东西 tmp指向,您之前分配的那些 16 个字节仅由 tmp 指向.

    How can list now be equal to tmp when list doesn't have any allocated memory?


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

    Is list pointing to the address of tmp? If yes, why do we need to not allocate memory for list since earlier in the code, we did this int *tmp = malloc(4 * sizeof(int));


    代码释放第一个分配的内存块。如果它没有分配第二 block 内存,那么任何一个指针都不会指向任何有效的东西!

    关于c - 将内存重新分配到空引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63478181/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com