传递给C函数的结构指针即使在前向声明后也不起作用

时间:2017-09-12 19:15:41

标签: c pointers struct

我是C的新手,正在学习链接列表。我正在使用Linux Mint上的代码块IDE和GCC编译器。我试图将结构指针传递给一个可以帮助我遍历链表的函数。这是我现在的代码:

#include <stdio.h>
#include <stdlib.h>

void gothru(struct node * Root);

struct node {
    int data; //data in current node
    struct node * next; //pointer to the next node
};

void gothru(struct node * Root){
    struct node * conductor; //this pointer will be used to traverse the linked list
    conductor = Root; //conductor will start at the Node

    /* Conductor traverses through the linked list */
    if(conductor != NULL){
        while(conductor->next != NULL){
            printf("%d->",conductor->data);
            conductor = conductor->next; /*if current position of conductor is not pointing to
                                           end of linked list, then go to the next node */
        }
        printf("%d->",conductor->data);
    }

    printf("\n");

    if (conductor == NULL){
        printf("Out of memory!");
    }

    free(conductor);
}

int main()
{
    struct node * root; //first node

    root = malloc(sizeof(*root)); //allocate some memory to the root node

    root->next = NULL; //set the next node of root to a null/dummy pointer
    root->data = 12; //data at first node (root) is 12

    gothru(root); //traverse linked list


    return 0;
}

现在,我已经使用与首次初始化函数时完全相同的格式在顶部声明了我的函数。但是,我仍然收到以下错误:

  

| 11 | error:'gothru'的冲突类型

我试过更改我的&#34; gothru&#34;函数到简单变量,在这种情况下它起作用。但是当我改回指向结构的指针时,它给了我这个错误。

Stackoverflow中的先前答案说我们需要转发声明我们的函数来清除此错误。我这样做了,但它仍然不起作用。任何解决方案?

2 个答案:

答案 0 :(得分:4)

gothru函数的前向声明包含结构类型作为参数之一,因此,您需要在结构定义之后移动gothru的前向声明。

否则,函数参数(类型)在前向声明时间内是未知的。

这样的东西
struct node {
    int data; //data in current node
    struct node * next; //pointer to the next node
};

void gothru(struct node * Root);  // struct node is known to compiler now

应该解决问题。

答案 1 :(得分:1)

如果我们尝试编译代码,使用gcc就可以得到这个:

vagrant@dev-box:~/tests$ gcc test.c
test.c:4:20: warning: ‘struct node’ declared inside parameter list [enabled by default]
 void gothru(struct node * Root);
                    ^
test.c:4:20: warning: its scope is only this definition or declaration, which is probably not what you want [enabled by default]
test.c:11:6: error: conflicting types for ‘gothru’
 void gothru(struct node * Root){
      ^
test.c:4:6: note: previous declaration of ‘gothru’ was here
 void gothru(struct node * Root);
      ^

首先显示的警告对于理解这里发生的事情至关重要。这里,struct node首先在函数原型中声明,它的范围就是那一行。但它宣布了这个功能。现在,在定义了struct node之后,您遇到了函数定义,但在此行中struct node意味着与第一个原型中遇到的本地struct node不同。这就是为什么你为这个函数获得一个冲突类型的原因。

解决方案正如@ SouravGhosh的答案所指出的那样,即在函数原型之前移动结构定义。