0

这是我的第一个 C 程序,我不知道为什么会出现以下错误。

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

typedef struct {
    struct ListNode* next;
   int content;
} ListNode;

int main() {
    //puts("Hello UPC World"); /* prints Hello UPC World */

    //ListNode* h = malloc(sizeof(ListNode));
    gridinit(3, 5);
    //int c = h->content;
    //printf("%d",c);

    return EXIT_SUCCESS;
}

ListNode* gridinit(int numcolumns, int numrows) {
    ListNode* head = malloc(sizeof(ListNode));
    head->content = 2;
    head->next = NULL;
    return head;
}

为什么我会收到一条错误消息

func gridinit() 中的类型冲突

4

5 回答 5

2

TL;DR答案 - 对于在定义之前使用(调用)的所有函数,您需要在调用者函数之前为这些函数添加前向声明。在这种情况下,由于定义gridinit()是写在之后main()并且main()使用gridinit()你必须添加之前的gridinit()前向声明,main()你会很高兴。

为了详细说明这种情况,在您的main()函数中,您正在调用gridinit(),但在那之前,编译器并不知道gridinit()函数的原型。

由于向后兼容,一个称为函数隐式声明的特性假定在定义或声明之前已经使用过的函数接受任意数量的参数并返回一个int.

稍后,当您实际定义函数时,您将返回类型设置为ListNode*,这会在此处产生冲突。

FWIW,根据C99标准(以后),隐式函数声明的(邪恶)特性已被正式删除,但编译器仍然继续支持遗留代码。如果您启用编译器警告并以严格的一致性进行编译,您应该得到编译器的警告(甚至停止),以防缺少前向声明。

于 2015-09-01T11:51:43.557 回答
2

在结构顶部定义函数声明

ListNode* gridinit(int numcolumns, int numrows);

typedef struct {
    struct ListNode* next;
   int content;
} ListNode;

 int main() {
//puts("Hello UPC World"); /* prints Hello UPC World */

//ListNode* h = malloc(sizeof(ListNode));
gridinit(3, 5);
//int c = h->content;
//printf("%d",c);

return EXIT_SUCCESS;
}

ListNode* gridinit(int numcolumns, int numrows) {
ListNode* head = malloc(sizeof(ListNode));
head->content = 2;
head->next = NULL;
return head;
}
于 2015-09-01T11:48:05.503 回答
2

那是因为您的函数是在调用之后定义的。您可以在您之后struct和之前声明函数main的原型

ListNode* gridinit(int numcolumns, int numrows);

你会很适合编译。

于 2015-09-01T11:48:40.283 回答
2

添加前向声明一切正常gridinit()

...

typedef struct {
    struct ListNode* next;
   int content;
} ListNode;

// Declare the gridinit function
ListNode* gridinit(int, int);

...
于 2015-09-01T11:48:40.307 回答
0

gridinit在调用它之前应该有一个声明或定义main(编译器需要知道它存在)。

此外,您不应忽略 的返回值gridinit,它返回您已为其分配内存的指针(忽略它会导致内存泄漏),而应将其分配给h而不分配内存main(因为您已经在gridinit)。

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

typedef struct {
    struct ListNode* next;
    int content;
} ListNode;

ListNode* gridinit(int numcolumns, int numrows) {

int main() {
    //puts("Hello UPC World"); /* prints Hello UPC World */

    ListNode* h = gridinit(3, 5);
    int c = h->content;
    printf("%d",c);

    return EXIT_SUCCESS;
}

ListNode* gridinit(int numcolumns, int numrows) {
    ListNode* head = malloc(sizeof(ListNode));
    head->content = 2;
    head->next = NULL;
    return head;
}
于 2015-09-01T11:54:55.010 回答