请解释sizeof()的输出

我是c编程的新手,我正在尝试理解sizeof函数。

请帮我理解这个程序是如何工作的:

 #include main( ) { printf ( "\n%d %d %d", sizeof ( '3'), sizeof ( "3" ), sizeof ( 3 ) ) ; } 

我输出为4 2 4

但是,我无法理解我得到此输出的原因。 请解释一下。

  1. sizeof ( '3') ,它是字符常量的大小,它是int所以你的机器上的值为4

  2. sizeof ( "3" ) ,它是字符串的大小,即2
    字符串"3"由2个字符组成('3'+'\0') = "3" 。 我们知道sizeof(char)是1。

  3. sizeof ( 3 ) ,它的大小为int ,在你的机器上为4

首先,几个笔记:

  • 你不应该省略main的返回类型。 请参阅C和C ++中main()返回的内容?
  • 启用警告。 在GCC上,你通常会使用-Wall 。 这应该会给你一个关于你的格式字符串的警告。
  • 在C99中,您应该使用%zu而不是%d如如何以便携式打印size_t变量中所述? 。 C标准说sizeof的结果sizeofsize_t (§6.5.3.4/ 5)。 如果您的转换说明符与您的参数不匹配,则它是未定义的行为 。

在你的问题上。

  • 在comp.lang.c FAQ中 , 问题8.9解释了C中的字符常量是int类型,因此sizeof('3')sizeof(int) (在您的机器上看起来是4)。
  • 应用于数组时, sizeof以字节为单位返回数组的大小。 例如, sizeof(int[10])sizeof(int)为4的机器上返回40.因为sizeof(char)是1,它将等于字符串文字中的字符数。 正如Jonathan Leffler所解释的那样:

    1. sizeof(“f”)必须返回2,一个用于’f’,一个用于终止’\ 0’。

    2. […]

    字符串文字的类型为’char的大小为N的数组’,其中N包含终止null。

    请记住,传递给sizeof时, 数组不会衰减 1指针。

    1 数组没有衰减成指针的exception?

  • 最后, sizeof(3)sizeof(int)