sizeof 与 chars 的混淆行为

标签 c sizeof

<分区>

#include <stdio.h>
#include <string.h>

int main(void)
{
    char ch='a';

    printf("sizeof(ch)          = %d\n", sizeof(ch));
    printf("sizeof('a')         = %d\n", sizeof('a'));
    printf("sizeof('a'+'b'+'C') = %d\n", sizeof('a'+'b'+'C'));
    printf("sizeof(\"a\")       = %d\n", sizeof("a"));
}

此程序使用 sizeof 来计算大小。为什么 'a' 的大小与 ch 的大小不同(其中 ch='a')?

sizeof(ch)          = 1
sizeof('a')         = 4
sizeof('a'+'b'+'C') = 4
sizeof("a")         = 2

最佳答案

TL;DR - sizeof 作用于操作数的类型

  • sizeof(ch) == sizeof (char)--------------------(1)
  • sizeof('a') == sizeof(int) ------------------( 2)
  • sizeof ('a'+ 'b' + 'c') == sizeof(int) ---(3)
  • sizeof("a") == sizeof(char [2]) ----------(4)

现在让我们看看每个案例。

  1. ch 被定义为 char 类型,所以,非常简单。

  2. 在 C 中,sizeof('a')sizeof (int) 相同,因为字符常量的类型为整数。

    引用C11

    An integer character constant has type int. [...]

    在 C++ 中,字符 literal 的类型为 char

  3. sizeof 是编译时运算符(除非操作数是 VLA),因此使用表达式的类型。如前所述,所有整数字符常量都是 int 类型,因此 int + int + int 产生 整数。所以操作数的类型取为int

  4. "a" 是两个 char 的数组,'a'0 (空终止符)(不,它不会衰减到指向数组类型的第一个元素的指针),因此大小与具有两个 char 元素。


就是说,最后,sizeof 产生了 size_t 类型的结果,因此您必须使用 %zu 格式说明符来打印结果。

关于sizeof 与 chars 的混淆行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51173976/

相关文章:

c - 多维数组的大小

c - 初学者的指针(带代码)

c - 64 位 CPU 上不同整数大小的效率

c - "sizeof"的结果取决于括号的位置。为什么?

c - 乘以 sizeof(char) 不同于仅乘以 char 的大小

c++ - 成员初始值设定项中使用的 sizeof 的行为是什么?

c - 包含双字段的结构的大小

c - 如何为大整数实现整数数组加法器?

c++ - 获取 gsl_vector_view 的大小

c - c中的管道问题