理想情况下这段代码不应该在结束前释放tmp吗?

问题描述 投票:0回答:1

我很困惑为什么在将 list 设置为指向 tmp 指向的位置后,此代码释放列表而不是 tmp (

list = tmp;
)

// Implements a list of numbers with an array of dynamic size

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

int main(void)
{
    // List of size 3
    int *list = malloc(3 * sizeof(int));
    if (list == NULL)
    {
        return 1;
    }

    // Initialize list of size 3 with numbers
    *list = 1;
    *(list + 1) = 2;
    *(list + 2) = 3;

    // List of size 4
    int *tmp = malloc(4 * sizeof(int));
    if (tmp == NULL)
    {
        free(list);
        return 1;
    }

    // Copy list of size 3 into list of size 4
    for (int i = 0; i < 3; i++)
    {
        tmp[i] = list[i];
    }

    // Add number to list of size 4
    tmp[3] = 4;

    // Free list of size 3
    free(list);

    // Remember list of size 4
    list = tmp;

    // Print list
    for (int i = 0; i < 4; i++)
    {
        printf("%i\n", list[i]);
    }

    // Free list
    free(list);
    return 0;
}

arrays c pointers malloc free
1个回答
0
投票

唯一重要的是,您使用与

free
接手时相同的 地址 来拨打
malloc
。分配的内存与该地址相关联,而不是与指针变量名称相关联。

  • 在第一个
    free(list);
    处,您释放了用
     int *list = malloc(3 * sizeof(int));
    分配的第一个块。
  • list = tmp;
    现在
    list
    tmp
    都指向同一个位置,从这个malloc调用返回的地址:
    int *tmp = malloc(4 * sizeof(int));
  • 从那里我们可以执行
    free(list)
    free(tmp)
    ,这并不重要,因为它们指向同一位置,并且这是从
    malloc(4 ...
    调用返回的原始地址。
  • 在第二个
    free()
    之后,
    list
    tmp
    都是“悬空指针”,它们指向不再可用的内存区域。因此,在调用 free 之后直接将指针设置为
    NULL
    通常是一个好习惯。
© www.soinside.com 2019 - 2024. All rights reserved.