声明的数组数据成员没有大小 我试图理解C++中数组是如何工作的。有一些好的线索,但有一个问题我找不到答案:
为什么可以声明没有大小的数组数据成员?我认为C++中的数组大小必须是编译时常数?< /p> 例如:声明的数组数据成员没有大小 我试图理解C++中数组是如何工作的。有一些好的线索,但有一个问题我找不到答案:,c++,arrays,C++,Arrays,为什么可以声明没有大小的数组数据成员?我认为C++中的数组大小必须是编译时常数?< /p> 例如: #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 ope
#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的数组数据成员存储在自动存储中,但大小是在运行时动态确定的
谢谢
为什么可以声明没有大小的数组数据成员
在标准C++中,它不是。在C语言中,可以将一个数组放在结构的末尾,以允许使用可变大小的数组,但必须确保为想要使用的任何大小分配足够的存储空间。一些C++编译器可能会允许这是非标准扩展。
这是否意味着obj2的数组数据成员存储在自动存储中,但大小是在运行时动态确定的
不,这意味着阵列没有任何存储空间,您正在堆栈的其他部分上进行写入。那不是个好主意
如果您想要一个动态数组,则使用C++标准9.2类成员
使用STD::Vector .< /P> < P> 9非静态9.4数据成员的类型不得不完整。在里面 特别是,C类不应包含C类的非静态构件 C、 但它可以包含指向C类对象的指针或引用 因此,它要么是一个编译器特性,要么是它的bug 作为类的非静态数据成员的数组存储在分配该类的相应对象的位置 对于C,则C允许定义结构的灵活数组成员 来自C标准6.7.2.1结构和联合规范 18作为一种特殊情况,结构的最后一个构件 一个命名成员可能具有不完整的数组类型;这就是所谓的 柔性阵列成员 但在这种情况下,结构应具有多个命名构件。不可能。char数组[]与指向char的指针相同。这意味着你可以做到这一点char* pointer;
char array[];
array=pointer;
指针具有值,创建指针时该值在内存中。只是指向记忆中的某个地方。
数组的工作方式与指针相同。如果int有4个字节,则数组[5]指向该指针后面的int 5*4=20字节
int array[];
array[5];
*(array+5);
C++在穿越数组后不会引发异常。通常程序应该崩溃,因为默认情况下指针指向程序内存中的某个地方。C99允许一种称为灵活数组成员的功能。C11标准的§6.7.2.1/18对此进行了描述: 作为特例,结构的最后一个元素具有多个 命名成员可能具有不完整的数组类型;这就是所谓的 灵活的数组成员。在大多数情况下,灵活的数组成员 被忽略了
它们不是C++的一部分,但有些编译器允许它们作为扩展使用。例如,在他们的C扩展页面上明确指出:
<>在ISO99中的一些特征,而不是C90或C++,也如 GCC在C90模式和C++中的扩展, 为了兼容性,Clang通常实现GNU扩展。请注意,在所述成员上使用sizeof似乎是GCC错误或扩展: 灵活数组成员的类型不完整,因此 不能应用运算符。作为原始实现的一个怪癖 对于零长度数组,sizeof的计算结果为零另外,在C++中,唯一的数据成员是一个GNU扩展的灵活数组成员。
< P>将您的测试移动到一个从主调用的新函数,然后您应该看到堆栈粉碎。零大小数组不是标准C++的一部分。实际上,适当的术语是灵活数组成员。与:。。。char数组[]是一个灵活的数组成员,它是编译器扩展。这不是C++。在C语言中有灵活的数组,但C语言是另一种语言。谢谢,我将研究灵活数组。顺便说一句,obj2的数组成员是否存储在我文章中示例中的堆栈上?匿名向下投票的原因是什么?我相当肯定这是正确的,但如果它是错误的,我想纠正它。