使用C ++中的各种数据类型解释sizeof()

时间:2015-09-30 04:18:34

标签: c++ sizeof string-literals

附加问题(1分): 假设我们使用的是32位Windows操作系统 和C / C ++程序。请估计下面的sizeof()(单位:字节)

• char str[] = “Hello” ;
• char *p = str ;
• int n = 10;
Please calculate:
• sizeof ( str ) = __________
• sizeof ( p ) = __________
• sizeof ( n ) = __________

大家好,

我试图在C ++中围绕这个相当基本的概念。我会告诉你我认为正确的答案是看我是否走在正确的轨道上。对于第一个,sizeof(str),我相信它总共是6个字节。我注意到其他问题的模式,这些类型的字符串总是添加1个字节。 (5个字母+1)。我的问题是,这是什么" + 1"从?至于第二个下来,这只是指指针的大小,p,正确吗?哪个大小总是4个字节?最后,第三个,我相信只是指一个int的大小,n。据我所知,所有的大小都是4字节正确吗?这是否意味着所有整数都是4个字节,无论其是10还是10000,还是任何其他数字。关于这个主题的任何其他重要信息也非常感谢并张开双臂接受!谢谢!

4 个答案:

答案 0 :(得分:1)

char str[] = "Hello" ;

相当于:

char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};

标准保证sizeof(char)1。因此sizeof(str)6

指针和int的大小始终取决于平台。

答案 1 :(得分:1)

好吧,这是我在stackoverflow上的第一个答案

第一个问题:

 char str[] = "Hello";

在C / C ++字符数组中需要空终止(' \ 0')或(NULL)来标识字符数组的结尾,每当我们读取字符数组时指针放在第一个索引和它循环,直到我们找到空终止字符。其大小为6。

注意空终止字符因编译器而异(根据我的知识),通常它们使用' \ 0'。 你也可以使用零(0);

char s[] = {'H','E','L','L','O',0};

或' NULL'

char s[] = {'H','E','L','L','O',NULL};

第二个问题:

char *p = str 

字符指针' p'存储字符数组的地址' str' 它指向字符数组的第一个索引并存储地址。 这是4个字节。因此你得到了

  • sizeof ( p ) = 4 // p holds the address of str

如果您使用了* p(p值),那么您将获得1的值。

 • sizeof ( *p ) = 1 // Now *p is value at p i.e first element in
                 character array = 'H' which is of size 1 byte

第三个问题

int n = 10

这显然会让你在32位系统上的大小为4字节(8位)。

同样,编译器的大小也各不相同。

谈论你的上一个问题

  

这是否意味着所有整数都是4个字节,无论它是10还是10000,或者   任何其他数字

答案是肯定的,不是 对于16位C / C ++编译器,signed int的范围是-32768到32767。

对于32位编译器,范围是-2147483648到+2147483647

此范围之间的任何数字(类型为signed int)将在32位编译器上占用4个字节,如Turbo C

  

此主题的任何其他重要信息也非常感谢   张开双臂接受

有趣的事实 如上所述

int n = 2147483648 //note the extra 1 

仍然会打印或存储

2147483647 in n

尝试一下(在32位编译器上)

其次 用C ++表示字符串,即

string str = "Hello";
• str.size() = 5 // note: its not 6 

我希望我回答了你的问题并提供了更多信息。

答案 2 :(得分:0)

  

我注意到其他问题的模式总是有1个字节   添加到这些类型的字符串。 (5个字母+1)。我的问题是,什么   这是“+1”来自?

该1字节用于空终止,即'\ 0'。 想一想。

如果你使用strlen(在运行时计算)而不是sizeof(在编译时计算),strlen()开始扫描第一个字符的字符串,递增计数,移动到下一个字符,必须有一些字符在字符串必须标记它的结束,对吧?这就是null终止的目的。

  

据我所知,所有的大小都是4字节正确吗?

     

C ++标准没有以字节为单位指定整数类型的大小,   但它规定了必须遵守的最小范围。

这已在此解释。 [What does the C++ standard state the size of int, long type to be?

良好的做法是始终使用标准定义以避免此类混淆。

查看

  

“stdint.h”或“cstdint”

头文件,如果你在Linux上。不确定窗户。

int8_t,int16_t,int32_t,uint8_t,uint16_t,uint32_t

这些使代码更具可读性。

答案 3 :(得分:0)

在C ++中,如果我们将数组传递给sizeof,我们得到它的长度;不是它衰减到大小的指针。字符串文字是n个字符的数组,带有空终止符。

所以

const char str[] = "foobar";

sizeof(str) == 7因为实际上它会在内存中列出如下:

const char str[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};

这是一个编译时常量,只要定义了数组,编译器就会知道它。

如果您指向该数组const char *strp = str,然后sizeof(strp) == sizeof(char*)

至于intT*的大小(其中T是任何对象类型),它是实现定义的。但是sizeof(T*) == sizeof(U*) == sizeof(void*)其中TU是任何对象类型。

唯一的保证是sizeof(char) == 1。其他任何事情都取决于实施。

来自N4140(C ++ 14标准草案)

  

§3.9.1基本类型
  2 - 有五种标准的有符号整数类型:“signed char”,“short int”,“int”,“long int”和“long”   long int“。在此列表中,每种类型至少提供与列表中前面的存储一样多的存储空间。   也可能存在实现定义的扩展有符号整数类型。标准和扩展签名   整数类型统称为有符号整数类型。普通的锭子具有自然尺寸   执行环境的架构 46 ;提供其他有符号整数类型以满足特殊要求   需要。

所以你得到的实际保证是:

sizeof(signed char) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

signed charchar的大小相同,但属于不同的类型,unsigned char与两者的大小相同,但又是另一种不同的类型。

另一方面,对于大多数系统,它将是这样的:

64位操作系统,sizeof(T*) == 8
32位操作系统,sizeof(T*) == 4

以及64位和32位系统sizeof(int) 通常 == 4

其中T是任何对象类型