这两个在C语言中使用sizeof()有什么不同?

3

如果我执行sizeof('r'),字符'r'在内存中需要4个字节。或者,如果我先声明一个char变量并像这样初始化:

  char val = 'r';
  printf("%d\n", sizeof(val));

输出结果表明,'r'只需要1字节的内存。
为什么会这样呢?

1
'c' 是字符 c 的 ASCII 值。 - juankirr
抱歉,您的示例中的'r'是ASCII表中的114(一个整数有4个字节)。 - juankirr
输出表明“r”只需要1个字节的内存是不正确的结论。输出表明“val”需要1个字节的内存。 - chux - Reinstate Monica
4个回答

4

这是因为常量'c'被解释为一个int类型。 如果您运行以下代码:

printf("%d\n", sizeof( (char) 'c' ) );

它将打印1


谢谢你,Kenney,我明白了!我把我的例子中所有的“c”都改成了“r”,因为我意识到我不一致了。 - user5405027
1
哦,好吧,所有字符大小都一样,不是吗;-) - Kenney

3
在 C 语言中,字面值 'c' 被称为整型字符常量,并根据 C 标准规定:

10. 整型字符常量的类型为 int

另一方面,在 C++ 中这个字面值被称为字符字面值,并且根据 C++ 标准规定:

包含单个可在执行字符集中表示的 c-char 的普通字符字面值的类型为 char

在下面的声明中:

char val = 'r';

变量val被明确声明为char类型。在两种语言中,sizeof(char)都等于1。


1
这是因为字面值'r'被视为整数,其值为ASCII值。通常需要4个字节的int,因此输出结果是这样的。在第二种情况下,您明确将其声明为字符,因此它输出1。
如果尝试这行代码printf("%d",(10+'c'));,它将打印出109作为输出,即(10+99)

0

为了进一步澄清,您可能需要查看这个表格。 http://goo.gl/nOa5ju(字符的ASCII表)

首先,在C语言中有两种类型的int。16位(2字节)和32位(4字节)。

C语言中的常量char被认为是与其在表格上表示的字符相关的整数。'c'的十进制值为99(每个2字节)。

那么你就得到了char或者说int值为99或4字节。

另一方面,char var = 'c';是一个1字节的值,因为ASCII用8位(1字节)表示。 c类型大小表http://goo.gl/yhxmSF


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接