C,数组是否需要比其元素更多的内存空间?

时间:2017-03-25 17:13:40

标签: c arrays memory-management

假设我们有一个大小为40的char数组,

char buffer[40];

其次,让我们说这个数组是完整的,有人写了40个字符。

因此,我们可以说这个数组的元素占用40个字节,因为每个字符都是1个字节。

我的问题是: 我们的数组 实际上 在内存中占用了多少空间?它会占用40个字节的空间还是更多?是否需要额外的位来识别char类型的数组,并且是否允许空终止所需的额外位?如果是这样,我们可能需要更多像42字节的东西来将这个数组存储在内存中。

因此,我想知道我是否可以在一个具有40个分配字节的内存空间中可靠地拟合40个字符的数组。

4 个答案:

答案 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 }])