2016-03-04 100 views
2

确定一个人如何建立与可以不同为每个结构体被设置,理想地由一个参数的阵列的结构?该应用程序是一个支持的不同阵列,但是固定长度C结构在编译时

我尝试看起来服用点像这样的单个数据类型,这显然didnt编译:

struct Data_struct(n) 
{ 
    int xData[n]; 
    int test; 
}; 
+0

ERR,这'的INT [n] XDATA;'不会编译任何方式。 – alk

+0

@alk是的,我很快意识到。在我的辩护中,周五是下午5点:P – Mauvai

回答

3

唯一可用的方法是使用一个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)); 

请注意,我们曾经为柔性阵列明确分配额外的空间。

+1

灵活的阵列成员的类型不完整,所以sizeof运算符可能不适用。见https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html –

+0

另外请注意,在“阵列”必须是结构的最后一个成员,这导致了隐含的约束,只有一个这样的每个“struct”的“数组”是可能的。 – alk

1

通常你会限定在该结构的端部的可变长度数组,然后在运行时,例如修复了大小

typedef struct 
{ 
    int test; 
    int xData[1]; 
} Data_struct; 

给大小的n分配结构,如这对xData你会做soemthing这样的:

Data_struct * s = malloc(sizeof(Data_struct) + (n - 1) * sizeof(int)); 
+0

这里要记住的是你在愚弄编译器。 sizeof(DataStruct)将是错误的,按值传递将失败。 – pm100

+0

@ pm100:是的,这是真的 - 我不知道C99的灵活阵列成员(请参阅Bill的答案)是否在这方面有所改进? –

+0

@PaulR:铛和gcc没有警告我:http://ideone.com/HxI8ds –

2

您可以动态分配数组

struct Data_struct 
{ 
    int * xData; 
    int test; 
}; 

.... 

s.xData = calloc(size, sizeof(int)) 

和记得释放外部数据时完成

+1

我不知道为什么这会吸引倒票 - 这当然是一个有效的答案? –

+0

不是我的失望,但用你的解决方案'Data_Struct'不再是一块连续的内存。 –

+0

@MichaelWalz:真的,但我不认为有一个完美的解决方案 - 它取决于各种因素,所以在某些情况下这可能是一个更好的解决方案(例如,如果你想要一个这样的结构数组)。 –

0

有人可能会调用这个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分配空间。

+0

OP特别要求“支持不同但固定长度的数组的单个数据类型**”。 –

+0

@PaulR。但是你已经写了这个答案。我不需要可能有用的malloc。 –

+0

问题在于它没有回答OP提出的问题,因为他想要一种数据类型 - 因此,您的答案可能会导致其他人前来阅读此问题的困惑。所以我不得不倒票,遗憾的是。 –