【问题标题】:How do I create a 2D array of struct using dynamic allocation?如何使用动态分配创建二维结构数组?
【发布时间】:2017-02-11 03:46:40
【问题描述】:

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

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));
}

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

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

感谢任何反馈 谢谢

【问题讨论】:

    标签: c arrays struct 2d


    【解决方案1】:

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

    对于一维数组,您只需将名称或头指针传递给它。

    对于使用第一种方法的二维数组,taskArray 是一个由 8 个(深度)一维数组组成的数组,该数组由 25 个结构(宽度)组成。您可以为这个一维数组中的每一个调用 Insert,只需传入它们的头指针 taskArray[i] 即可。

    对于使用第二种方法的二维数组,它的想法类似,只是你必须将一维数组的索引转换为二维数组。 8 个 1D 数组中的每一个的头指针都是 taskArray[i * 8],对于第 i 个。

    【讨论】:

    • 嗨neo,我如何调用这个二维数组的插入函数(对于你给出的两个tge例子)只是发送第i行。因为插入行调用另一个结点来计算它的索引 j。对于一维数组 tge 函数如下。
    • Insert (Task task [], char *name1, double use) { int i= getindex (name1);任务 [i].name=name1; }
    • 您好,对于一维数组,插入函数如下: Insert (Task task[], char *name1, double use) { int i= getindex (name1);任务[i].name=name1;在调用函数时如何更改插入函数以获取 1 个 50 个元素的数组。
    • 答案已更新,希望它能解决您的问题。我的建议是在移动指针或动态分配内存之前,尝试掌握C中的多维数组概念,这将有助于您在编程中获得流畅的体验。
    • 当然,谢谢,我会这样做,当我为 8 执行 for 循环(如上所述)并执行 printf 时,我没有得到二维数组中的数据,但是当我执行for 循环到 25,然后执行类似 taskArray [r][c] 的 printf,我得到二维数组中的数据。这是什么原因?我不明白为什么会这样。你能解释一下吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2021-12-20
    • 2021-05-13
    • 1970-01-01
    • 2020-01-24
    • 2013-05-02
    • 2013-02-22
    相关资源
    最近更新 更多