我正在编写一个程序,我必须将一组结构指针传递给主体中的函数,如下所示
struct node *vertices[20];
create_vertices (&vertices,20);
函数的实现是这样的事情
void create_vertices (struct node *vertices[20],int index)
{
}
在这里我必须传递一个索引为20的结构指针数组, 我在电源外做的声明如下:
void create_vertices(struct node **,int);
然而,每次编译代码时,这三行只会出现问题
bfs.c:26:6: error: conflicting types for ‘create_vertices’
bfs.c:8:6: note: previous declaration of ‘create_vertices’ was here
bfs.c: In function ‘create_vertices’:
bfs.c:36:15: error: incompatible types when assigning to type ‘struct node’ from type ‘struct node *’
我无法理解我应该怎么做。 我希望能做的是:
代码必须在C上,我在Linux上测试它。 有人能指出我吗?
答案 0 :(得分:4)
电话&vertices
中create_vertices(&vertices, 20)
的类型不是您的想法。
它是指向结构的指针数组的指针:
struct node *(*)[20]
而不是
struct node **
将&
放入通话中,您将重新开始营业。
编译(在Mac OS X 10.7.4上使用GCC 4.7.0):
$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -c x3.c
x3.c: In function ‘func1’:
x3.c:16:9: warning: passing argument 1 of ‘create_vertices’ from incompatible pointer type [enabled by default]
x3.c:7:10: note: expected ‘struct node **’ but argument is of type ‘struct node * (*)[20]’
$
代码:
struct node { void *data; void *next; };
void make_node(struct node *item);
void func1(void);
void create_vertices(struct node **array, int arrsize);
void create_vertices(struct node *vertices[20], int index)
{
for (int i = 0; i < index; i++)
make_node(vertices[i]);
}
void func1(void)
{
struct node *vertices[20];
create_vertices(&vertices, 20);
}
删除&
,代码编译干净。
答案 1 :(得分:2)
正如您所写:struct node *vertices[20];
声明了一个指向节点的指针数组。现在,如果你想创建一个改变其元素的函数,你应该声明一个将这种数组作为参数的函数:
void create_vertices(struct node *arr[20], int size)
或者因为在这种情况下可以省略大小,所以最好将其声明为:
void create_vertices(struct node *arr[], int size)
注意,可以像这样调用此函数:create_vertices(vertices, 20);
使该函数的第一个参数(arr
)指向此数组的第一个元素。您可以在此功能中更改此数组,并且可以在外部看到更改。
假设您的函数void foo(struct node *ptr)
更改了node
指向的ptr
。当您声明struct node *ptr;
并传递给此函数时:foo(ptr);
,它可以更改此node
对象并且更改在外部可见,但它无法更改传递的指针ptr
本身。当您需要在函数内更改指针以便在外部可以看到更改时,就是将指针地址传递给函数并将指针指向指针时的情况。
答案 2 :(得分:0)
在create_vertices
的原型中,第一个参数是指向结构的指针。在定义中,第一个参数是一个包含20个结构指针的数组。
原型和定义必须相同。