【问题标题】:How to pass multiple list(hlist) as function arguments in C如何在C中将多个列表(hlist)作为函数参数传递
【发布时间】:2016-08-05 08:42:36
【问题描述】:
hlist_t hlist[4];

int hlist_init (hlist_t **hlist) {
    int i;
    for (i = 0; i < 4 ; i++) {
    INIT_HLIST_HEAD ( hlist [i]);
    }

    return 1;
}



int main () {
    hlist_init (&hlist);

    return 0;
}

我有这样的代码,但它不起作用。 作为 * hlist[] 的参数也不起作用。 我应该如何处理? **hlist 和 *hlist[] 有何不同?

下面是代码的错误信息。 /media/hdd1/tcn/lbtest/main.c:20:5:警告:从不兼容的指针类型传递“hlist_init”的参数 1 [默认启用] /media/hdd1/tcn/lbtest/main.c:6:5:注意:预期为“struct hlist_t **”,但参数类型为“struct hlist_t (*)[4]”

【问题讨论】:

  • 怎么“不起作用”,错误是什么,详情?
  • hlist_t **hlist 是指向hlist_t 的指针,hlist_t *hlist[] 是指向hlist_t 的指针数组的未识别长度。它们作为函数参数没有区别,因为函数参数中的数组声明将被转换为指向其元素的指针。
  • 在函数的参数列表上下文中hlist_t ** hlist和hlist_t * hlist[]是等价的。
  • 我添加了一些代码,这是错误消息!谢谢您的帮助! @MikeCAT

标签: c arguments double-pointer


【解决方案1】:

在函数参数列表中,**hlist 和*hlist[] 完全相同。因此,将一个更改为另一个不会有任何区别。

这是因为 C 有“数组衰减”,即在大多数情况下,数组名称衰减到指向其第一个元素的指针。因此,无论您使用的是**hlist 还是*hlist[],都不会复制整个数组。所以无论哪种情况,你都不能通过写foo(hlist);来传递数组。

您似乎希望hlist 是指向hlist_t 的指针数组。如果是这样,请这样做:

hlist_t *hlist[4];

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    相关资源
    最近更新 更多