【问题标题】:C language: How exactly is the size of an array calculated in C [duplicate]C语言:C语言中数组的大小到底是如何计算的[重复]
【发布时间】:2020-05-12 08:11:26
【问题描述】:

内存地址指定了它们在内存中指向的数据字节数,因此似乎任何变量的大小都是通过查看内存地址并查看变量在内存中占用的数量来确定的。那么数组的大小是怎么确定的??? - 因为默认情况下,数组是指向数组中第一项的指针:

int main() {
    int a[] = {1,2,3,4,5};
    // both show same memory address
    printf("%p\n", a);
    printf("%p\n", &a[0]);
    // somehow the entire size of a is calculated
    printf("%lu\n", sizeof(a)); // 20 (all elements)
    return 0;
}

【问题讨论】:

  • 你混淆了数组和指针这不是一回事
  • 数组不是指针
  • “内存地址指定了它们在内存中指向的数据字节数”。不,他们没有。编译器根据变量的类型而不是内存地址来计算。
  • 明显重复
  • Philip,为什么代码使用 "%lu"sizeof(a) 而不是 "%zu" 或其他?

标签: c arrays pointers sizeof memory-address


【解决方案1】:

当你写作时

int a[] = {1,2,3,4,5};

编译器已经知道“a”中只有 5 个整数。

当你打电话时

sizeof(a)

您的编译器(不是您的程序)将计算 a 的大小。这基本上在您的程序中设置了数字“20”。每次你的程序运行时,它都会输出数字 20,它不会使用 sizeof。这不是在运行时评估的,而是在编译时评估的,因为在您的情况下 sizeof 是一个编译时运算符。 (需要注意的是,当您有可变长度数组时,可以在运行时评估 sizeof)

【讨论】:

  • 不是 100% 的真相。前段时间sizeof 评估了编译时间,一切都很简单。现在在 VLA 时代 sizeof 也可以动态计算运行时——例如int foo(int x) { int y[x]; printf("%zu\n", sizeof(y)); }
  • 很好,我的回答主要是在问题的背景下。我编辑以反映您的评论。感谢指正
猜你喜欢
  • 1970-01-01
  • 2021-04-17
  • 2023-04-09
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 2021-08-29
相关资源
最近更新 更多