确定一个人如何建立与可以不同为每个结构体被设置,理想地由一个参数的阵列的结构?该应用程序是一个支持的不同阵列,但是固定长度C结构在编译时
我尝试看起来服用点像这样的单个数据类型,这显然didnt编译:
struct Data_struct(n)
{
int xData[n];
int test;
};
确定一个人如何建立与可以不同为每个结构体被设置,理想地由一个参数的阵列的结构?该应用程序是一个支持的不同阵列,但是固定长度C结构在编译时
我尝试看起来服用点像这样的单个数据类型,这显然didnt编译:
struct Data_struct(n)
{
int xData[n];
int test;
};
唯一可用的方法是使用一个flexible array member。
struct Data_struct {
int test;
int xData[];
};
你会那么本次使用malloc()
分配空间:
int n = 4;
struct Data_struct *s = malloc(sizeof(struct Data_struct) + n * sizeof(int));
请注意,我们曾经为柔性阵列明确分配额外的空间。
灵活的阵列成员的类型不完整,所以sizeof运算符可能不适用。见https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html –
另外请注意,在“阵列”必须是结构的最后一个成员,这导致了隐含的约束,只有一个这样的每个“struct”的“数组”是可能的。 – alk
通常你会限定在该结构的端部的可变长度数组,然后在运行时,例如修复了大小
typedef struct
{
int test;
int xData[1];
} Data_struct;
给大小的n
分配结构,如这对xData
你会做soemthing这样的:
Data_struct * s = malloc(sizeof(Data_struct) + (n - 1) * sizeof(int));
这里要记住的是你在愚弄编译器。 sizeof(DataStruct)将是错误的,按值传递将失败。 – pm100
@ pm100:是的,这是真的 - 我不知道C99的灵活阵列成员(请参阅Bill的答案)是否在这方面有所改进? –
@PaulR:铛和gcc没有警告我:http://ideone.com/HxI8ds –
您可以动态分配数组
struct Data_struct
{
int * xData;
int test;
};
....
s.xData = calloc(size, sizeof(int))
和记得释放外部数据时完成
我不知道为什么这会吸引倒票 - 这当然是一个有效的答案? –
不是我的失望,但用你的解决方案'Data_Struct'不再是一块连续的内存。 –
@MichaelWalz:真的,但我不认为有一个完美的解决方案 - 它取决于各种因素,所以在某些情况下这可能是一个更好的解决方案(例如,如果你想要一个这样的结构数组)。 –
有人可能会调用这个UGL Ÿ但在这里。使用#define
#define foo(n) struct Data_struct##n { int test; int xData[n]; }
foo(20);
struct Data_struct20 abc;
foo(20)定义了一个n = 20个字符的结构。 如果您愿意,您可以使用另一个#define分配空间。
OP特别要求“支持不同但固定长度的数组的单个数据类型**”。 –
@PaulR。但是你已经写了这个答案。我不需要可能有用的malloc。 –
问题在于它没有回答OP提出的问题,因为他想要一种数据类型 - 因此,您的答案可能会导致其他人前来阅读此问题的困惑。所以我不得不倒票,遗憾的是。 –
ERR,这'的INT [n] XDATA;'不会编译任何方式。 – alk
@alk是的,我很快意识到。在我的辩护中,周五是下午5点:P – Mauvai