我试图了解数组在C++中是如何工作的。一些好的线索,但我有一个问题,我找不到答案是:
为什么可以声明没有大小的数组数据成员?我认为在C++中数组大小必须是编译时常数?
示例:
#include<iostream>
class Object{
public:
Object(std::size_t n){
for(std::size_t i = 0; i<n; ++i) { array[i] ='X'; }
//prints 0 because 'sizeof' is compile-time operator
std::cout << "compile-time size: " << sizeof(array) << std::endl;
std::cout << "run-time size " << n << std::endl;
}
private:
char array[];
};
int main( int argc, char** argv )
{
Object obj(10); //10 chars
std::size_t n;
std::cin >> n;
Object obj2(n); //n chars in automatic storage i.e. on the stack??
}
Input:
n = 1000
Output:
compile-time size: 0
run-time size 10
compile-time size: 0
run-time size 1000这是否意味着obj2 2的数组数据成员存储在自动存储中,但大小是在运行时动态确定的?
谢谢
发布于 2014-10-28 17:21:37
根据C++标准(9.2级成员)
9非静态(9.4)数据成员不应具有不完全类型的。特别是,类C不应包含C类的非静态成员,但它可以包含指向C类对象的指针或引用。
因此,它要么是编译器特性,要么是它的错误。
作为类的非静态数据成员的数组存储在该类的相应对象被分配的位置。
对于C,C允许定义结构的灵活数组成员。
来自C标准(6.7.2.1结构和联合说明)
18作为特例,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。
但是在这种情况下,一个结构应该有多个,而不是一个指定的成员。
发布于 2014-10-28 17:21:26
为什么可以声明没有大小的数组数据成员?
在标准C++中,它不是。在C中,您可以在结构的末尾放置一个,以允许可变大小的数组,但您必须确保为您想要使用的任何大小分配足够的存储空间。一些C++编译器可能允许将其作为非标准扩展。
这是否意味着obj2 2的数组数据成员存储在自动存储中,但大小是在运行时动态确定的?
不,这意味着数组没有任何存储空间,而且您正在对堆栈的其他部分进行写入。这不是个好主意。
如果您想要动态数组,请使用std::vector。
发布于 2014-10-28 17:25:47
不行。char array[]与指向char的指针相同。这意味着你可以做到这一点。
char* pointer;
char array[];
array=pointer;指针具有值,指针创建时就在内存中。简单地指向记忆中的某个地方。
数组的工作方式与指针相同。如果 int 有4个字节,则array5将指向该指针后面的int 5*4=20。
int array[];
array[5];
*(array+5);C++在穿越数组后不会抛出异常。通常情况下,程序会崩溃,因为指针在默认情况下指向程序内存中的某个位置。
https://stackoverflow.com/questions/26614439
复制相似问题