【问题标题】:passing array of strucct pointers to function in c将结构指针数组传递给c中的函数
【发布时间】:2017-12-10 03:52:20
【问题描述】:

我正在尝试将指向结构的指针数组传递给函数。然后将该数组的地址分配给一个指针,并使用该指针来索引数组中的元素。

下面我创建了一个结构的三个实例并分配了结构值,然后我创建了一个指针数组并让数组中的元素指向这些结构。

然后我将结构数组传递给一个函数,该函数以两种不同的方式打印结构的值...

第一种方法是索引我传递给函数的数组并打印出各个结构中的值.... 这很好用!

第二种方法是我将数组分配给一个指针,然后我索引这个指针以打印出数组中的值......这不能正常工作

struct name_struct_pointer {
    char *name1;
    char *name2;
};
int main(void) {


struct name_struct_pointer name_struct_pointer_inst_1 = {"name one","name two"};
struct name_struct_pointer name_struct_pointer_inst_2 = {"name three","name four"};
struct name_struct_pointer name_struct_pointer_inst_3 = {"name five","name six"};

 struct name_struct_pointer * name_struct_pointer_array[3] = {
        &name_struct_pointer_inst_1,
        &name_struct_pointer_inst_2,
        &name_struct_pointer_inst_3
};

        print_array_of_name_struct(name_struct_pointer_array,3);
        return EXIT_SUCCESS;
}

void print_array_of_name_struct(struct name_struct_pointer * name_struct_pointer_array[],int size){

    puts("print data indexed by function arg");
        for(int i = 0; i < size;i++){
            printf("print_name_struct : %s : %s \r\n",name_struct_pointer_array[i]->name1,name_struct_pointer_array[i]->name2);
        }

    struct name_struct_pointer * local_name_struct_pointer_array = name_struct_pointer_array;
    puts("print data indexed by local pointer");
    for(int i = 0; i < size;i++){
        printf("print_name_struct : %s : %s \r\n",local_name_struct_pointer_array[i].name1,local_name_struct_pointer_array[i].name2);
    }
}

我希望指针索引方法的输出能够给出相同的结果,但这并没有发生。我的数据版本不正确。

打印由函数 arg 索引的数据
print_name_struct : 名称一 : 名称二
print_name_struct : 名称三 : 名称四
print_name_struct : 名字五 : 名字六
打印由本地指针索引的数据
print_name_struct : dP@ : vP@
print_name_struct : ïP@ : 名字五
print_name_struct : 名字六 : 名字三

我怀疑将数组分配给指针时发生了一些事情。我的理解是,如果我将数组分配给一个指针,我可以使用指针算法来索引数组中的数据。我不明白什么?

【问题讨论】:

  • 选择 C++ 或 C 而不是两者兼而有之。

标签: c arrays pointers


【解决方案1】:

方式 1:*local_name_struct_pointer_array 应声明为双指针 **local_name_struct_pointer_array,因为您分配的指针大小不兼容。

然后,您还应该将访问结构成员的方式从pointer[i].member 更改为pointer[i]-&gt;member

方式 2: 其他方式应该是保持您编写代码的方式,并且只将指针分配更改为:*local_name_struct_pointer_array = name_struct_pointer_array[0],因此您将获得指针数组的第一个元素,然后循环遍历元素。

【讨论】:

  • 就是这样。看起来双指针起到了作用。谢谢!
  • 另外,请注意编译期间的警告。你应该已经看到了,你应该已经注意到问题所在了。
【解决方案2】:

为什么不应该忽略警告的示例之一,尤其是涉及指针。该代码给出了“不兼容的指针类型”警告。

解决方案被声明为双指针

需要更改

struct name_struct_pointer ** local_name_struct_pointer_array =name_struct_pointer_array;

printf("print_name_struct : %s : %s \r\n",local_name_struct_pointer_array[i]->name1,local_name_struct_pointer_array[i]->name2);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2019-05-03
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多