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

C++ 用C+;中的各种数据类型解释sizeof()+;,c++,sizeof,string-literals,C++,Sizeof,String Literals,补充问题(1点): 假设我们使用的是32位Windows操作系统 和C/C++程序。请估计以下各项的sizeof()(单位:字节) 大家好, 我试图把我的思想围绕在C++中的一个相当基本的概念上。我会告诉你我认为正确的答案,看看我是否在正确的轨道上。对于第一个,sizeof(str),我相信它总共是6个字节。我从其他问题中注意到一种模式,即这些类型的字符串总是添加1个字节。(5个字母+1)。我的问题是,这个“+1”来自什么?至于下面的第二个,这只是指指针的大小,p,对吗?哪个总是4字节大小?最后

补充问题(1点): 假设我们使用的是32位Windows操作系统 和C/C++程序。请估计以下各项的sizeof()(单位:字节)

大家好,

我试图把我的思想围绕在C++中的一个相当基本的概念上。我会告诉你我认为正确的答案,看看我是否在正确的轨道上。对于第一个,sizeof(str),我相信它总共是6个字节。我从其他问题中注意到一种模式,即这些类型的字符串总是添加1个字节。(5个字母+1)。我的问题是,这个“+1”来自什么?至于下面的第二个,这只是指指针的大小,p,对吗?哪个总是4字节大小?最后,第三个,我相信是指int的大小,n。据我所知,所有整数的大小都是4字节,对吗?这是否意味着所有整数都是4字节,不管是10或10000,还是任何其他数字。关于这个主题的任何其他重要信息都将受到热烈的欢迎和接受!谢谢

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

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

如果您使用strlen(在运行时计算)而不是sizeof(在编译时计算),strlen()将在第一个字符开始扫描字符串,增加计数,移动到下一个字符,必须有某个字符使字符串标记其结束,对吗??这就是空终止的目的

据我所知,所有整数的大小都是4字节,对吗

C++标准没有指定字节中的整数类型的大小, 但它规定了他们必须遵守的最低范围

这里已经解释了这一点。 [

良好的实践是始终使用标准定义来避免此类混淆

调查

“标准力h”或“标准力”

如果您在linux上,则为头文件。不确定windows

int8、int16、int32、uint8、uint16、uint32

这些使代码更具可读性

char str[] = "Hello" ;
相当于:

char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};
该标准保证
sizeof(char)
1
。因此
sizeof(str)
6


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

好,这是我关于堆栈溢出的第一个答案

第一个问题:

 char str[] = "Hello";
char *p = str 
在C/C++中,字符数组需要一个空终止符('\0')或(null)来标识字符数组的结尾,每当我们读取字符数组时,指针被放置在第一个索引处,它循环直到我们找到空终止符。因此它的大小是6

注意:空终止字符因编译器而异(据我所知),通常它们使用“\0”。 也可以使用零(0)

或“空”

char s[] = {'H','E','L','L','O',NULL};
第二个问题:

 char str[] = "Hello";
char *p = str 
字符指针“p”存储字符数组“str”的地址 它指向字符数组的第一个索引并存储地址。 它有4个字节,因此

  • sizeof(p)=4//p保存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字节,或者 还有其他号码吗

答案是肯定和否定 对于C/C++的16位编译器,有符号int的范围是-32768到32767

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

在像Turbo C这样的32位编译器上,这个范围内的任何数字(类型signed int)都将占用4个字节

对于本主题的任何其他重要信息,我们也非常感谢和支持 张开双臂接受

有趣的事实 对于上述情况,如果

int n = 2147483648 //note the extra 1 
仍将打印或存储

2147483647 in n
试用(在32位编译器上)

其次 C++中的字符串,即

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

我希望我回答了你的问题并提供了附加信息。在C++中,

< P>,如果我们把数组传递给<代码> sieOS/<代码>,我们得到它的长度,而不是它衰减到的大小的指针。字符串文字是一个数组,它是一个数组,代码为“n>代码”,字符为null终止符。< /P> 所以

const char str[] = "foobar";
sizeof(str)==7
,因为实际上它会像这样被放在内存中:

const char str[] = {'f', 'o', 'o', 'b', 'a', 'r', '\0'};
这是一个编译时常量,一旦定义了数组,编译器就会知道它

如果将指针指向该数组,则
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-有五种标准的有符号整数类型:“有符号字符”、“短整数”、“整数”、“长整数”和“长整数” 在此列表中,每种类型提供的存储空间至少与列表中前面的类型相同。 也可能有实现定义的扩展有符号整数类型。标准和扩展有符号整数类型 整数类型统称为有符号整数类型 执行环境的体系结构46;提供了其他有符号整数类型以满足特殊需求 需要

因此,您得到的实际保证是:

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

sizeof(signed char)第一个是6。最后两个取决于