如何使用动态分配创建结构的2D数组?

时间:2017-02-11 03:46:41

标签: c arrays struct 2d

我有一个包含2个参数的结构,我创建了一个结构类型的1D指针数组,并为它分配内存。这将发送到一个函数,其中包含要添加的值。它下面的代码。

typedef struct {
    char name[LENGTH];
    double  use;
} Task;



Task *ctask;
  task = malloc(8 * sizeof(*task));

insert (Task task[], name, use){
    //does something
    task[i].name =  name;
    task[i].use = use;
}

我想知道的是如何创建一个类型为struct(大小为8 * 25)的指针的2D数组。并将其发送到函数insert()。

以下是否正确:

Task **ctask;
  task = malloc(8 * sizeof(*task));

for(int i=0;i<25;i++){
    task[i] = malloc(25 * sizeof(*task));
}

当我将它发送到插入功能时,是否需要更改它,或者我可以直接发送:

insert(task[i], name, use);

感谢任何反馈 感谢

1 个答案:

答案 0 :(得分:0)

C中,您可以使用指向数组(长度为25)的数组(长度为8)或数组(长度为8 * 25)来表示2D数组。有关详细信息,请参阅The C Programming Language by K&R

对于第一种方法,

Task **taskArray = (Task **) malloc(8 * sizeof(Task *));
int n;
for (n = 0; n < 8; n++) {
    taskArray[n] = (Task *) malloc(25 * sizeof(Task));
}
// access the row i, column j Task struct in the array
// taskArray[i][j]
// you will need its address/pointer to pass to insert function
// &taskArray[i][j] or taskArray[i] + j

对于第二种方法,

taskArray = (Task *) malloc(8 * 25 * sizeof(Task));
// access the row i, column j Task struct in the array
// taskArray[i * 8 + j]

关于调用Insert函数

Insert (Task task[], char *name1, double use) {
    int i = getindex(name1); 
    task[i].name = name1; 
}

从您的代码中,task将是struct数组的名称/ head指针,您可以使用task[i]访问其第i个结构。

对于1D数组,您只需通过名称或头指针即可。

对于使用第一种方法的2D数组,taskArray是一个8(深度)的数组,其中包含25个结构(宽度)的1D数组。你可以为这个1D数组中的每一个调用Insert,只需传入他们的头指针{i} {i}。

对于使用第二种方法的2D数组,除了必须将1D数组的索引转换为模拟为2D数组之外,它是类似的想法。对于第i个,8个1D阵列中每个阵列的头指针都是taskArray[i]