C:sizeof()相关的疑惑?

时间:2014-07-17 12:11:57

标签: c sizeof

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

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

输出:

4
1

为什么o / p为第一个printf而来4,而且如果我将它作为&#39;&#39;它显示错误为错误:空字符常量,但对于双引号空白,即没有任何空格是没有错误没有错误?

7 个答案:

答案 0 :(得分:8)

' '整数字符常量的示例,其类型为int(未转换,具有等类型)。第二个是"" 字符文字,它只包含一个字符,即空字符,并且由于sizeof(char)保证为1,整个数组的大小也是1

答案 1 :(得分:6)

' ' 转换为整数字符常量(因此在您的机器上为4个字节),&#34;&#34;是空字符数组,仍然是1字节(&#39; \ 0&#39;)终止。

答案 2 :(得分:5)

下面查看差异

 #include<stdio.h>
  int main()
  {
      char a= 'b';
      printf("%d %d %d", sizeof(a),sizeof('b'), sizeof("a"));
     return 0;

   }

此处a定义为character,其数据类型大小为1 byte

但是&#39; b&#39;是character constant。字符常量是integer,字符常量的值是机器字符集中字符的数值。 charof constant只是int is 4 byte

这是字符串文字&#34; a&#34; ---&GT;数组字符,其大小为字符数+ \0 (NULL)。这是2

答案 3 :(得分:3)

这在Size of character ('a') in C/C++

中得到了解答
  

在C中,字符常量的类型如&#39; a&#39;实际上是一个int,大小为4(或其他一些依赖于实现的值)。在C ++中,类型为char,大小为1.这是两种语言之间的许多小差异之一。

答案 4 :(得分:0)

&#39;空格&#39;或&#39;任何单个字符&#39;实际上是整数类型,等于该字符的ASCII值。所以它的大小将是4个字节。 如果您创建一个字符变量并在其中存储一个字符,那么它只存储在1字节的内存中。

char ch;
ch=' ';
printf("%d",sizeof(ch));
//outputs 1

对于任何字符串,它必须以表示为&#39; \ 0&#39;的空字符终止。 如果我们写一个字符串&#34; hello&#34;,它实际上存储为'h' 'e' 'l' 'l' 'o' '\0',以便系统知道字符串结束后的&#39; o&#39; in&#34;你好&#34;并且当空字符到来时它停止读取。如果使用strlen()函数,则此字符串的长度仍为5,但实际上sizeof(字符串)为6个字节。 当我们创建一个空字符串时,例如&#34;&#34;,它的长度为0,但是大小为1字节,因为它必须在它开始的地方终止,即在第0个字符处。 因此,空字符串只包含一个字符,即空字符,大小为1字节。

答案 5 :(得分:0)

来自C Traps and Pitfalls

单引号和双引号意味着C中的内容非常不同。

用单引号括起来的字符只是编写与ASCII实现中给定字符对应的整数的另一种方式。因此' '与32完全相同。

另一方面,用双引号括起来的字符串是一种编写指向无名数组初始字符的指针的简单方法,该数组已使用引号和一个额外字符(其二进制值为零。因此,写为空字符串的“”仍然具有大小为1的'\ 0'字符。

答案 6 :(得分:0)

因为在第一种情况下有一个字符,这就是sizeof运算符取字符的SACII值的原因,它取整数所以在第一种情况下它会给你4。 在第二种情况下,sizeof运算符作为字符串而在字符串中没有数据意味着它被理解为NULL字符串,因此NULL字符串大小为1,这就是为什么它会给你答案为1。