【问题标题】:Modifying a structure array through a pointer passed to a function通过传递给函数的指针修改结构数组
【发布时间】:2010-12-21 08:21:14
【问题描述】:

我正在尝试将结构数组指针和指向结构数组指针的指针传递给函数,然后对其进行修改而不是使用返回。

这个示例代码确实没有意义,对我来说只是一个学习示例。

基本上我想创建 array[0]...array[1]..array[2] 等等,并有一个指向这些的指针,同时使用不同的索引...例如 array_ref[2]指向array[0],array_ref[3]指向array[1]。

下面的代码可以编译,但会立即崩溃。有什么建议吗?

typedef struct unit_class_struct {
    char *name;
    char *last_name;
} person;




int setName(person * array, person ***array_ref) {
   array[0].name = strdup("Bob");
   array[1].name = strdup("Joseph");
   array[0].last_name = strdup("Robert");
   array[1].last_name = strdup("Clark");

*array_ref[2] = &array[0];
*array_ref[3] = &array[1];

    return 1;
}



int main()
{
    person *array;
    person **array_r;

   array = calloc (5, sizeof(person));
   array_r = calloc (5, sizeof(person));

   setName(array,&array_r);

    printf("First name is %s %s\n", array_r[2]->name, array_r[2]->last_name);
    printf("Second name is %s %s\n", array_r[3]->name, array_r[3]->last_name);

    return 0;
}

【问题讨论】:

    标签: c data-structures pointers argument-passing


    【解决方案1】:

    您正在分配一个结构数组,但声明一个指针数组。

    Calloc() 和 malloc() 返回一个 void * 对象,可以分配给任何东西。因此,即使使用-Wall,您的程序也将在没有警告的情况下编译。

    但是,当它运行时,它会尝试处理你所说的指针数组,实际上是指针数组。这些指针都没有被创建。你开始的只是指向对象数组的一级指针。根据您真正想要的,您可能需要更多类似...

        array_ref[2] = &array[0];
        array_ref[3] = &array[1];
    
        return 1;
    }
    
    
    int main()
    {
        person *array, *array_r_real;
        person **array_r;
    
        array = calloc(5, sizeof(person));
        array_r_real = calloc(5, sizeof(person));
        array_r = calloc(5, sizeof(struct unit_class_struct *));
        int i;
        for (i = 0; i < 5; ++i)
            array_r[i] = &array_r_real[i];
    
        setName(array, array_r);
    

    【讨论】:

    • 其实如果是我的程序,我可能会用:array_r[i] = array_r_real + i;
    猜你喜欢
    • 2021-11-02
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2010-09-29
    • 2013-11-15
    相关资源
    最近更新 更多