char firstName[32];
据我所知,每个char占用内存中的1个字节。那么上面占用了32个字节的内存吗?
我是否错过了一个占用内存的指针,或者只是32字节?
答案 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(可能)来存储地址。