c++中在结构体里面定义数组

35岁前换工作 2012-11-07 12:00:50
typedef struct _A
{
UINT8 length;
UINT8 data[];
}A;


这样在c里面写没问题
但是在c++里面会报错
warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array

请问为什么?怎么修改呢?
...全文
1999 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
请问楼主最后怎么解决了这个问题?定义一个指针,用的时候再malloc不行吗?
yuebinghaoyuan 2012-11-09
  • 打赏
  • 举报
回复
我在实习中,基本都是这么定义的。我结构体中都是使用的vector
rendao0563 2012-11-08
  • 打赏
  • 举报
回复
引用 15 楼 hibiko 的回复:
引用 8 楼 rendao0563 的回复:typedef struct _A { UINT8 length; UINT8 data[0]; }A; 这个不行
怎么不行? 是你不会用吧.
Jocodeoe 2012-11-07
  • 打赏
  • 举报
回复
既然用的是C++,那就用标准库的容器吧,除非对速度有非常高的要求,否则都不需要使用数组。
35岁前换工作 2012-11-07
  • 打赏
  • 举报
回复
引用 4 楼 suzhouxiao 的回复:
数组元素不确定,为什么不尝试用指针呢? C/C++ code1234567typedef struct _A { UINT8 length; UINT8* data; }A;
恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的 但是*data是不是有4字节的指针的控件啊?sizeof的时候会比data[]这种多出来4字节么?
叁叁玖玖 2012-11-07
  • 打赏
  • 举报
回复
UINT8 data[]; data 数组大小必须确定 数组元素不确定的话 可使用vector 容器吧
cy2015yc 2012-11-07
  • 打赏
  • 举报
回复
数组元素不确定,为什么不尝试用指针呢?

typedef struct _A {     
UINT8       length;              
UINT8*       data;          
}A; 


baichi4141 2012-11-07
  • 打赏
  • 举报
回复
数组长度必须在编译时确定 虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。 在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法 在C++里面,不允许这样定义
35岁前换工作 2012-11-07
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
搁一个正整数常量表达式在 [] 中就行了,比如 [1].
呃 这个肯定行……但是完全不一样啊 我数组元素不确定呢
ri_aje 2012-11-07
  • 打赏
  • 举报
回复
搁一个正整数常量表达式在 [] 中就行了,比如 [1].
35岁前换工作 2012-11-07
  • 打赏
  • 举报
回复
引用 8 楼 rendao0563 的回复:
typedef struct _A { UINT8 length; UINT8 data[0]; }A;
这个不行
mujiok2003 2012-11-07
  • 打赏
  • 举报
回复
错误提示说的很清楚了:nonstandard extension used : zero-sized array in struct/union 使用std::vector或std::array
lucky-lucky 2012-11-07
  • 打赏
  • 举报
回复

//python源码asdl.h
typedef struct {
    int size;
    void *elements[1];
} asdl_seq;	// Abstract Syntax Definition Language 
		//http://docs.python.org/devguide/compiler.html
//http://www.cs.princeton.edu/research/techreps/TR-554-97
在c语言中这样定义,空数组不占用任何空间,它只有偏移值,这样的方法是为了保留缓冲区和数据动态增长。 在C++中struct是特殊的class,编译器为其自动生成默认构造函数及拷贝构造函数,拷贝构造的过程中由于data本质是空的(在预编译的时候编译器根据data此可得偏移值,而在默认拷贝的过程中要拷贝该偏移值处的数据,而此处是空的,于是报错),c不会在预编译的时候考虑未预留的空间的值。 http://bbs.csdn.net/topics/120033131
Saleayas 2012-11-07
  • 打赏
  • 举报
回复

typedef struct _A
{
    UINT8       length;
    UINT8       data[ANYSIZE_ARRAY];
}A;
wumn29 2012-11-07
  • 打赏
  • 举报
回复
引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定 虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。 在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法 在C++里面,不允许这样定义
+1
Code_Talk 2012-11-07
  • 打赏
  • 举报
回复
引用 6 楼 hibiko 的回复:
引用 4 楼 suzhouxiao 的回复:数组元素不确定,为什么不尝试用指针呢? C/C++ code1234567typedef struct _A { UINT8 length; UINT8* data; }A; 恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的……
是的,你可以试试啊。3楼的解释很清楚,c里允许,但c++好像还不行。 用data[0]就可以,效果一样,也是不占空间。
Code_Talk 2012-11-07
  • 打赏
  • 举报
回复
引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定 虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。 在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法 在C++里面,不允许这样定义
+1 data[0]也可以。
rendao0563 2012-11-07
  • 打赏
  • 举报
回复
typedef struct _A { UINT8 length; UINT8 data[0]; }A;

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧