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回答 - 定義される前に使用される (呼び出される)すべての関数について、呼び出し元関数の前にそれらの関数の前方宣言を追加する必要があります。この場合、 is の定義gridinit()は aftermain()main()usesを記述しているため、 beforegridinit()の前方宣言を追加する必要があります。gridinit()main()

ケースを詳しく説明するには、main()関数で を呼び出していますgridinit()が、その時点まで、コンパイラは関数のプロトタイプについて何も知りませんgridinit()

下位互換性のため、関数の暗黙的宣言と呼ばれる機能、関数が定義または宣言される前に使用され、任意の数のパラメーターを受け入れ、int.

後で実際に関数を定義するときに、戻り値の型を asListNode*にしているため、ここで競合が発生しています。

FWIW、C99標準(以降)に従って、暗黙的な関数宣言の()機能は公式に削除されましたが、コンパイラはレガシーコードに対して引き続き同じ機能をサポートしています。コンパイラの警告を有効にし、厳密な準拠でコンパイルする場合、前方宣言が欠落している場合に備えて、コンパイラから警告を受ける (または停止する) 必要があります。

于 2015-09-01T11:51:43.557 に答える
2

前方宣言を追加するgridinit()と、すべて正常に動作します

...

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

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

...
于 2015-09-01T11:48:40.307 に答える
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 に答える
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 に答える