假设我们有一个大小为40的char数组,
char buffer[40];
其次,让我们说这个数组是完整的,有人写了40个字符。
因此,我们可以说这个数组的元素占用40个字节,因为每个字符都是1个字节。
我的问题是: 我们的数组 实际上 在内存中占用了多少空间?它会占用40个字节的空间还是更多?是否需要额外的位来识别char类型的数组,并且是否允许空终止所需的额外位?如果是这样,我们可能需要更多像42字节的东西来将这个数组存储在内存中。
因此,我想知道我是否可以在一个具有40个分配字节的内存空间中可靠地拟合40个字符的数组。
答案 0 :(得分:3)
与Java或C#等语言不同,C不会在运行时存储任何类型的元信息。因此,char[40]
只需要40个字节。
答案 1 :(得分:2)
它完全占用sizeof buffer
(常数)字节
由于buffer
是一个40 char
的数组,与40 * sizeof (char)
的数组相同,为40(sizeof (char)
定义为1)。
字符串终止零字节的最终空间必须是40中的一个。程序员有责任考虑该字节。
答案 2 :(得分:0)
确实需要40个字节,没有必要检查类型。最终我们从数组中存储char的ASCII值的二进制值。 并由您决定如何在int或char中打印此值。 关于终止的第二点,所以编译器不会放任何终止,数组的bcoz大小是预定义的。编译器将打印或获取从0到定义大小的数组值。 这是我的理解, 如果我错了,请纠正我。
答案 3 :(得分:0)
一般情况下,情况并非如此。 (我在这里想“struct []”。)但是,你已经具体询问char[]
所以它是。
(此外,堆栈或堆上可能存在开销/填充,但这不是声明的数据结构的一部分。)
至于char[]
与字符和以空字符结尾的字符串有关(当然,它有时会这样做),唯一一种分配了比你更多内存的情况expect是字符串文字:"8 chars"
相当于{ '8', ' ', 'c', 'h', 'a', 'r', 's', '\0' }
。 (这对编译器被告知要使用的源字符集和执行字符集做了一些假设,但你明白了。[可能"₹"
等同于{ 0xE2, 0x82, 0xB9, 0x00 }
])