2017-02-11 165 views
0

我有一个结构,它有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)的指针的二维数组。并将其发送到函数insert()。

这是下面正确的:

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

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

当IM将其发送到插入功能是否需要改变或可我只是在发:

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

感激任何反馈 感谢

回答

0

C中,您可以使用指向数组的指针(长度为25)或数组(长度为8 * 25)的数组(长度为8)来指定一个二维数组。详情请参阅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会名称/结构数组的头指针,你可以访问它的第i个结构ct使用task[i]

对于一维数组,您只需将它的名称或头指针过去即可。

对于使用第一种方法的二维数组,taskArray是一个包含25个结构(宽度)的8个(深度)一维数组的数组。您可以拨打Insert这个1D阵列的每一个,只是传递他们的头指针,taskArray[i]为第i。

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

+0

嗨,我该如何调用这个2D数组的插入函数(对于你给出的两个例子),只需发送第i行。因为插入行调用另一个结来计算其索引j。对于1d数组,tge的功能如下。 – anisha

+0

插入(任务任务[],char * name1,双重使用) { int i = getindex(name1); task [i] .name = name1; } – anisha

+0

您好, 的为一维数组插入功能是如下: 插入(任务任务[],字符* NAME1,双用途){ INT I = getindex(NAME1); task [i] .name = name1; } 在调用函数时,如何更改插入函数以获得50个元素的1个数组。 – anisha