【问题标题】:sizeof dynamic array is not correct [duplicate]sizeof 动态数组不正确 [重复]
【发布时间】:2016-01-08 03:09:04
【问题描述】:

在数组中有四个元素,所以它的大小应该是 4bit*4 = 16。(int 数据类型在我的系统中需要 4 位来存储值。)但是当我运行这段代码时,我只有 8 位作为dynamicArray 的大小。

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

int main(void) {

    //Dynamic arrays save memory by creating a pointer that stores
    //the beginning of the array
    int *dynamicArray = malloc(20 * sizeof(int));
    *dynamicArray = 10;
    printf("Address %x stores value %d\n", dynamicArray, *dynamicArray);

    dynamicArray[1] = 20;
    printf("dynamicArray[1] stores value %d\n", dynamicArray[1]);
    dynamicArray[2] = 45;
    printf("dynamicArray[2] stores value %d\n", dynamicArray[2]);
    dynamicArray[3] = 34;
    printf("dynamicArray[3] stores value %d\n", dynamicArray[3]);
    printf("The size of dynamicArray is %d\n", sizeof(dynamicArray));

    // Release unused memory:
    free(dynamicArray);

    return EXIT_SUCCESS;
}

这是输出的图像。

还建议我使用 C 网站检查内置函数属性或了解更多信息。 谢谢。

【问题讨论】:

  • "建议我使用 C 网站检查内置函数属性或了解更多信息" -- 抱歉,但这是题外话。只需谷歌该功能以获取其详细信息。
  • 并使用%p 打印地址,而不是%x

标签: c malloc sizeof dynamic-arrays


【解决方案1】:
  • 你没有数组;你有一个指针。

  • 指针的大小以字节为单位,而不是位。

  • sizeof 在编译时进行评估,对于任何给定的表达式或类型都是常量。它不依赖于数组中“填充”元素的数量(或指向包含这些元素的某个空间的指针)。

你的表达式相当于sizeof(int*),在你的环境中指针是8个字节。

【讨论】:

  • 其实我想检查的是'malloc'释放了未使用的内存。我初始化了 dynamicArray 指针以指向第一个元素。因为我只使用 20 个元素中的 4 个元素,所以它应该释放其余的空间。那么我该如何检查这个。正如你所说,如果我做 sizeof(dynamicArray) 它将返回指针的大小。
  • @HemantParihar:“由于我只使用 20 个元素中的 4 个元素,它应该释放其余空间。” 它没有理由这样做。跨度>
  • 我在某处发现,通过使用动态内存分配,我们可以释放未使用的内存。我们如何才能做到这一点。我是 C 新手。你能推荐一些关于动态内存管理和 malloc 的链接吗?
  • @HemantParihar:您可以使用realloc 调整内存大小。
  • 我可以释放未使用的内存吗?
【解决方案2】:

我在我的 32 位计算机上运行了您的代码,sizeof(dynamicArray) 的值报告为 4。我敢打赌您的计算机是 64 位的,这就是为什么值改为 8。

查看:http://www.viva64.com/en/a/0004/ 并查找标题为“表 N2。32 位和 64 位数据模型。”的表。这将有助于解释为什么一些系统报告 4 和一些报告 8 的值 sizeof(dynamicArray)

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 2017-09-10
    • 1970-01-01
    • 2021-12-20
    • 2020-12-22
    • 2020-11-09
    • 2011-07-26
    • 1970-01-01
    相关资源
    最近更新 更多