附加问题(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,还是任何其他数字。关于这个主题的任何其他重要信息也非常感谢并张开双臂接受!谢谢!
答案 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*)
。
至于int
或T*
的大小(其中T
是任何对象类型),它是实现定义的。但是sizeof(T*) == sizeof(U*) == sizeof(void*)
其中T
和U
是任何对象类型。
唯一的保证是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 char
与char
的大小相同,但属于不同的类型,unsigned char
与两者的大小相同,但又是另一种不同的类型。
另一方面,对于大多数系统,它将是这样的:
64位操作系统,sizeof(T*) == 8
32位操作系统,sizeof(T*) == 4
以及64位和32位系统sizeof(int)
通常 == 4
。
其中T
是任何对象类型