4

我正在编写一个程序,其中我必须将结构指针数组传递给主体中的函数,如下所示

     struct node *vertices[20];
create_vertices (&vertices,20);

功能的实现是这样的

void create_vertices (struct node *vertices[20],int index)
{
}

在这我必须传递一个索引为 20 的结构指针数组,我在 mains 之外所做的声明如下

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 *’

我无法理解我应该怎么做。我想要做的是:

  1. 在 main 中声明一个结构指针数组(我已经这样做了)。
  2. 将数组的地址传递给函数(这是我搞砸的地方)。
  3. 在主电源之外声明正确的函数原型。

代码必须在 C 上,我正在 Linux 上对其进行测试。有人能指点我吗?

4

3 回答 3

5

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

删除&和代码编译干净。

于 2012-06-01T06:59:14.333 回答
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本身。当您需要更改函数内的指针以使更改在外部可见时,这就是您将指针地址传递给函数以获取指针的情况。

于 2012-06-01T07:00:15.290 回答
0

在 的原型中create_vertices,第一个参数是指向结构指针的指针。在定义中,第一个参数是指向结构的 20 个指针的数组。

原型和定义都必须相同。

于 2012-06-01T07:01:35.920 回答