C样式字符数组 - 我们存储多少字节?

时间:2010-08-09 18:55:34

标签: c++ arrays char byte

char firstName[32];

据我所知,每个char占用内存中的1个字节。那么上面占用了32个字节的内存吗?

我是否错过了一个占用内存的指针,或者只是32字节?

7 个答案:

答案 0 :(得分:11)

不,这占用了大约32个字节的内存。 没有指针。

这通常是一个混乱的领域,因为数组名称默默地“衰变”为“char *”

char* fname = firstName;

因此,firstName可能是const char*类型,但它本身不是char *变量。它完全像:

 int x = 5;

x是int变量并占用空间。另一方面,5只是int类型的常量值。它没有空间;这只是一个价值。

答案 1 :(得分:2)

它占用了大约32个字节的内存。内部一切都是一个地址。变量只是为了我们的理解。

答案 2 :(得分:1)

这只是32个字节。有时的数组名称就像指向第一个元素的指针,但不是指针。

答案 3 :(得分:1)

占用32个字节。它将包含一个31个字符的字符串(另一个字节用于空字符串终止符)。

答案 4 :(得分:1)

语句char firstName[32]堆栈上创建一个包含32个字符或32个字节的数组。因为它在堆栈上,所以编译器确切地知道它与堆栈指针的关系。编译器会将数组的地址硬编码到任何使用它的操作中;没有必要存储指针。

重要的是要注意,如果您尝试将此数组作为函数参数传递,它将降级为数组的指针,因为C ++不允许按值传递基本数组。大多数不熟悉C ++的人都希望它能传递一个数组副本。

答案 5 :(得分:0)

您需要时可以使用两种方法,例如: 32个字节,用于存储您的数据。这两个版本的区别在于:

// version 1
char *firstName = new char[32];

// version 2
char firstName[32];

对于版本1,您的数据在上分配的空间,您必须在程序结束前释放,而在版本2中,空间位于堆栈 。两者都会给你一个指向可用空间的第一个字节的变量,在这两种情况下这个空间都是32个字节。人们会争辩说你有理由想要choose one over the other,但这是另一回事。

sizeof(firstName)

有趣的一点是sizeof将返回的内容,这是版本1的版本1和32的char指针(取决于您的系统和编译器)的大小。请记住另一个用户提到的内容,传递 firstName 到函数会将其降级为指针。

答案 6 :(得分:-1)

在调试版本中,还有一些字节存储在数组之外(在某些编译器上)以检查数组后的写入。在发布版本中,它应该是32个字节加上堆栈上的一个int(可能)来存储地址。