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

时间:2022-08-30 18:35:09
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

请问为什么?怎么修改呢?

18 个解决方案

#1


搁一个正整数常量表达式在 [] 中就行了,比如 [1].

#2


引用 1 楼 ri_aje 的回复:
搁一个正整数常量表达式在 [] 中就行了,比如 [1].

呃 这个肯定行……但是完全不一样啊 我数组元素不确定呢

#3


数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义

#4


数组元素不确定,为什么不尝试用指针呢?

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


#5


UINT8       data[]; 
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧

#6


引用 4 楼 suzhouxiao 的回复:
数组元素不确定,为什么不尝试用指针呢?
C/C++ code1234567typedef struct _A {     UINT8       length;              UINT8*       data;          }A;

恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的 但是*data是不是有4字节的指针的控件啊?sizeof的时候会比data[]这种多出来4字节么?

#7


既然用的是C++,那就用标准库的容器吧,除非对速度有非常高的要求,否则都不需要使用数组。

#8


typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;

#9


引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
+1    data[0]也可以。

#10


引用 6 楼 hibiko 的回复:
引用 4 楼 suzhouxiao 的回复:数组元素不确定,为什么不尝试用指针呢?
C/C++ code1234567typedef struct _A {     UINT8       length;              UINT8*       data;          }A;
恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的……
是的,你可以试试啊。3楼的解释很清楚,c里允许,但c++好像还不行。  用data[0]就可以,效果一样,也是不占空间。

#11


引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义

+1

#12



typedef struct _A
{
    UINT8       length;
    UINT8       data[ANYSIZE_ARRAY];
}A;

#13



//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

#14


错误提示说的很清楚了: nonstandard extension used : zero-sized array in struct/union

使用std::vector或std::array

#15


引用 8 楼 rendao0563 的回复:
typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;

这个不行

#16


引用 15 楼 hibiko 的回复:
引用 8 楼 rendao0563 的回复:typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;
这个不行


怎么不行? 是你不会用吧.

#17


我在实习中,基本都是这么定义的。我结构体中都是使用的vector

#18


请问楼主最后怎么解决了这个问题?定义一个指针,用的时候再malloc不行吗?

#1


搁一个正整数常量表达式在 [] 中就行了,比如 [1].

#2


引用 1 楼 ri_aje 的回复:
搁一个正整数常量表达式在 [] 中就行了,比如 [1].

呃 这个肯定行……但是完全不一样啊 我数组元素不确定呢

#3


数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义

#4


数组元素不确定,为什么不尝试用指针呢?

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


#5


UINT8       data[]; 
data 数组大小必须确定
数组元素不确定的话 可使用vector 容器吧

#6


引用 4 楼 suzhouxiao 的回复:
数组元素不确定,为什么不尝试用指针呢?
C/C++ code1234567typedef struct _A {     UINT8       length;              UINT8*       data;          }A;

恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的 但是*data是不是有4字节的指针的控件啊?sizeof的时候会比data[]这种多出来4字节么?

#7


既然用的是C++,那就用标准库的容器吧,除非对速度有非常高的要求,否则都不需要使用数组。

#8


typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;

#9


引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义
+1    data[0]也可以。

#10


引用 6 楼 hibiko 的回复:
引用 4 楼 suzhouxiao 的回复:数组元素不确定,为什么不尝试用指针呢?
C/C++ code1234567typedef struct _A {     UINT8       length;              UINT8*       data;          }A;
恩 这样可以 还有一个问题是 别人跟我说data[]这样的定义是不占空间的……
是的,你可以试试啊。3楼的解释很清楚,c里允许,但c++好像还不行。  用data[0]就可以,效果一样,也是不占空间。

#11


引用 3 楼 baichi4141 的回复:
数组长度必须在编译时确定
虽然动态数组已经出现在标准里很长时间,但一直没有普及,至少我不懂。但即使是动态数组,也必须在定义时给出数组长度,只是这个长度可以在运行时再确定而已。

在C里面,这样定义的“数组”实际上是指向结构体后面空间的指针,是一种巧妙的用法
在C++里面,不允许这样定义

+1

#12



typedef struct _A
{
    UINT8       length;
    UINT8       data[ANYSIZE_ARRAY];
}A;

#13



//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

#14


错误提示说的很清楚了: nonstandard extension used : zero-sized array in struct/union

使用std::vector或std::array

#15


引用 8 楼 rendao0563 的回复:
typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;

这个不行

#16


引用 15 楼 hibiko 的回复:
引用 8 楼 rendao0563 的回复:typedef struct _A
{
    UINT8       length;         
    UINT8       data[0];         
}A;
这个不行


怎么不行? 是你不会用吧.

#17


我在实习中,基本都是这么定义的。我结构体中都是使用的vector

#18


请问楼主最后怎么解决了这个问题?定义一个指针,用的时候再malloc不行吗?