【问题标题】:array size stays the same even after memory allocation即使在内存分配之后,数组大小也保持不变
【发布时间】:2026-01-27 16:50:01
【问题描述】:

我知道这可能很愚蠢,但我不明白为什么在我使用 malloc 为汽车分配内存后,汽车大小为 8。我输入到 carsAmount 的大小无关紧要,请帮忙。 当我在分配它之前检查数组大小时 - 它是 8。 我试图释放它,但出现错误。 我尝试使用 realloc-didnt 工作。

这是我的代码 sn-p:

int* cars = NULL;
int carsAmount;

printf("Enter cars amount:\n");
scanf("%d",&carsAmount);
cars = realloc(cars, (carsAmount)*sizeof(int));

【问题讨论】:

  • 也试过这个:cars = malloc(carsAmount*sizeof(int));
  • 相同尺寸是什么意思?你知道sizeof(cars) 会返回指针的大小而不是数组的大小吗?
  • 当你说“cars size is 8”时,你是用sizeof(cars)来检查的吗? cars 是一个指针,你系统上一个指针的大小是 8 个字节。 sizeof 没有告诉您分配了多少元素。您必须自己跟踪。
  • 我使用 sizeof(cars)/sizeof(int) 检查了数组返回值是 2 中有多少元素,
  • 好的,所以如果你单独检查它们,我想你会发现sizeof(cars) 是8(指针大小),sizeof(int) 是4(整数大小)。所以这就是为什么你会得到 2。虽然答案相同 - 它没有告诉你已经分配了多少。

标签: c arrays linux ubuntu dynamic-memory-allocation


【解决方案1】:

从问题中不清楚您如何尝试获取数组大小,但我猜您正在使用 sizeof(cars) 并且总是得到 8。那是因为 sizeof(cars) 会给您 cars 指针的大小, 并且 64 位架构中的所有指针都是 8 字节长。

Malloc 和 realloc 在内部保留缓冲区的大小,但您作为用户应该跟踪它。

【讨论】:

    【解决方案2】:

    来自realloc 手册页

    void *realloc(void *ptr, size_t size);
    

    如果ptr为NULL,则调用等价于malloc(size)

    相当于

    cars = malloc(carsAmount*sizeof(int))
    

    malloc() 和 calloc() 函数返回一个指向已分配的指针 为任何类型的变量适当对齐的内存。出错时, 这些函数返回 NULL。

    要检查分配是否成功,只需检查是否

    if (cars != NULL)
    {
        // allocation ok 
    } else {
       // Allocation failed
    }
    

    sizeof(int*) / sizeof(int)
        |            |
        V            V
    sizeof(cars)/sizeof(int)
    

    实际上是指针的大小,可能是 8,而 int 的大小可能是 4。这就是你得到 2 的原因。

    【讨论】: