2012-04-16 135 views
0

我有一个数组'y'与x号。 (数字'x'由用户给出),我需要创建一个结构数组,其元素的类型与数组'y'中的元素完全相同,即结构数组将具有'x'元素。动态名称结构变量C

+1

不错。你有什么问题? – AusCBloke 2012-04-16 12:40:26

+0

如果你有一个数组,你必须有一个长度来安全地使用它。为什么不能分配一组相同长度的结构? – 2012-04-16 12:48:12

回答

0

如果我理解你是正确的,你有一个类型的“数组”,元素的数量由用户决定。我猜你给它分配使用malloc这样的:

type_of_y *y = malloc(x * sizeof(type_of_y)); 

现在要创建一个从结构类似的“阵列”,与相同数量的元素。为什么你不能像y那样做呢? I.e:

struct my_structure *new_array = malloc(x * sizeof(struct my_structure)); 
0

您可能需要一个像这样的结构。阵列的类型显示为ArrayType;你可以写intdouble或其他任何适合你的东西。

typedef struct array 
{ 
    size_t  num_elements; // stores the 'x' value 
    ArrayType *arr_elements; 
} array; 

然后可以分配该类型的数组:

array *list = calloc(sizeof(array), number); 
for (int i = 0; i < number; i++) 
{ 
    list[i].arr_elements = malloc(sizeof(*list[i].arr_elements) * array_size); 
    list[i].num_elements = array_size; 
} 

您应该错误检查内存分配:

if (list == 0) 
    ...error... 

    if (list[i].arr_elements == 0) 
    { 
     ...release already allocated space... 
     ...error... 
    } 

注意,在阵列的list(可能每个阵列不是名称的最佳选择)可以有不同数量的元素; num_elements告诉你特定数组有多大。

请注意,C99 灵活阵列成员在这里并不是真的有帮助。你不能拥有一个包含灵活数组成员的结构数组,尽管你可以有一个指向数组的指针。

+0

当你设置结构的两个部分后,使用'calloc()'没有优化:) – Eregrith 2012-04-16 13:20:29

0
/* new array */ 
MYSTRUCT *abc = (MYSTRUCT *)calloc(x, sizeof(MYSTRUCT)); 
/* copy contents of 'y' into new array */ 
for (int i = 0; i < x; i++) 
    abc[i] = y[i];