【问题标题】:Different compilers showing different results for sizeof() operator不同的编译器对 sizeof() 运算符显示不同的结果
【发布时间】:2020-11-09 23:28:30
【问题描述】:
#include<stdio.h>
int main(void)
{
    unsigned const* const a, b;
    printf("size of a: %ld, size of b: %ld ", sizeof(a), sizeof(b));
    return 0;
}

此代码在不同的编译器上给出不同的输出。 在 gcc 编译器中,输出为:

"a的大小:8,b的大小:4

在 MSVS 2019 编译器和 MinGW 编译器中,输出为

"a的大小:4,b的大小:4

我正在寻找这种行为背后的解释。

编辑:

ab 这里有不同的变量类型吗?

【问题讨论】:

  • a 是指针,b 不是
  • * 绑定到变量,而不是类型,这就是为什么许多人更喜欢将其写为 int *a, b; 的原因。或者更好地将它们分开int *a;int b; 并避免所有可能的混淆。

标签: c visual-studio gcc mingw


【解决方案1】:

在 32 位程序指针是 32 位长 == 4 字节。 64 位构建将具有 64 位长指针 - 因此是 8 个字节。

int 的大小至少为 2 个字节 - 通常为 4 个。

但即使是同一个编译器也可以给你不同的数字(如果编译 32 位或 64 位程序):

https://godbolt.org/z/a45MPa

【讨论】:

  • 这里的变量a和b有不同的类型吗?
  • a 是指向unsigned int 的指针,bunsigned int
  • @Shubhashish 是的,a 是指向(常量)无符号整数的(常量)指针,但 b 只是(常量)无符号整数
【解决方案2】:

虽然 4 字节整数大小是典型的,但不能保证。特别是,大小取决于硬件和编译器。不同编译器的int大小可以是2字节也可以是4字节。

【讨论】:

    【解决方案3】:

    声明

    unsigned const* const a, b;
    

    被解析为

    unsigned const (* const a), b;
    

    因此,ab 具有不同的类型 - a 是一个 const 指向 const unsigned int 的指针,而 b 只是一个 const unsigned int

    这是 C 声明语法的一个方面,它没有被很好地教过,并且经常让人绊倒。声明分为两个主要部分 - 声明说明符序列和声明符序列。指针性、数组性和函数性被指定为声明符的一部分。对于数组和函数声明符,这很明显,因为 []() 运算符是后缀,但对于指针,它会令人困惑,因为 a) * 运算符是一元的,而不是后缀,并且 b) 空格没有意义 - @987654333 @ 和 T* p 的解释方式相同,如 T (*p)

    对于上面的声明,声明说明符是unsigned const,声明符是* const ab

    C 没有为大多数类型指定确切的大小 - 相反,它指定了这些类型必须能够表示的值的最小范围。 unsigned int 必须能够表示至少[0..65535] 范围内的值,这意味着它必须至少 16 位宽,但可能更宽。指针类型与架构需要的一样大,通常在 64 位系统上为 8 个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-04
      • 2013-05-14
      • 2019-07-08
      • 2016-07-14
      • 2012-02-01
      • 2016-12-28
      相关资源
      最近更新 更多