首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有大小声明的数组数据成员

没有大小声明的数组数据成员
EN

Stack Overflow用户
提问于 2014-10-28 17:14:16
回答 5查看 907关注 0票数 0

我试图了解数组在C++中是如何工作的。一些好的线索,但我有一个问题,我找不到答案是:

为什么可以声明没有大小的数组数据成员?我认为在C++中数组大小必须是编译时常数?

示例:

代码语言:javascript
复制
#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的数组数据成员存储在自动存储中,但大小是在运行时动态确定的?

谢谢

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-10-28 17:21:37

根据C++标准(9.2级成员)

9非静态(9.4)数据成员不应具有不完全类型的。特别是,类C不应包含C类的非静态成员,但它可以包含指向C类对象的指针或引用。

因此,它要么是编译器特性,要么是它的错误。

作为类的非静态数据成员的数组存储在该类的相应对象被分配的位置。

对于C,C允许定义结构的灵活数组成员。

来自C标准(6.7.2.1结构和联合说明)

18作为特例,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。

但是在这种情况下,一个结构应该有多个,而不是一个指定的成员

票数 3
EN

Stack Overflow用户

发布于 2014-10-28 17:21:26

为什么可以声明没有大小的数组数据成员?

在标准C++中,它不是。在C中,您可以在结构的末尾放置一个,以允许可变大小的数组,但您必须确保为您想要使用的任何大小分配足够的存储空间。一些C++编译器可能允许将其作为非标准扩展。

这是否意味着obj2 2的数组数据成员存储在自动存储中,但大小是在运行时动态确定的?

不,这意味着数组没有任何存储空间,而且您正在对堆栈的其他部分进行写入。这不是个好主意。

如果您想要动态数组,请使用std::vector

票数 4
EN

Stack Overflow用户

发布于 2014-10-28 17:25:47

不行。char array[]与指向char的指针相同。这意味着你可以做到这一点。

代码语言:javascript
复制
char* pointer;
char array[];
array=pointer;

指针具有值,指针创建时就在内存中。简单地指向记忆中的某个地方。

数组的工作方式与指针相同。如果 int 有4个字节,则array5将指向该指针后面的int 5*4=20。

代码语言:javascript
复制
int array[];
array[5];
*(array+5);

C++在穿越数组后不会抛出异常。通常情况下,程序会崩溃,因为指针在默认情况下指向程序内存中的某个位置。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26614439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档