Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明的数组数据成员没有大小 我试图理解C++中数组是如何工作的。有一些好的线索,但有一个问题我找不到答案:_C++_Arrays - Fatal编程技术网

声明的数组数据成员没有大小 我试图理解C++中数组是如何工作的。有一些好的线索,但有一个问题我找不到答案:

声明的数组数据成员没有大小 我试图理解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

为什么可以声明没有大小的数组数据成员?我认为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 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的数组成员是否存储在我文章中示例中的堆栈上?匿名向下投票的原因是什么?我相当肯定这是正确的,但如果它是错误的,我想纠正它。