Конфликт типа для ошибки функции

Это моя первая программа на 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()

5 ответов

Определите объявление вашей функции в начале вашей структуры

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

Добавить предварительную декларацию для gridinit() и все отлично работает

...

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

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

...

Это потому, что ваша функция определяется после ее вызова. Вы можете объявить прототип функции сразу после вашего struct и раньше main как

ListNode* gridinit(int numcolumns, int numrows);

и ты будешь хорош для компиляции.

TL; DR answer - Для всех функций, которые используются (вызываются) до того, как они определены, вам необходимо добавить предварительное объявление для этих функций перед функцией вызывающей стороны. В этом случае в качестве определения gridinit() написано после main() а также main() использования gridinit() Вы должны добавить предварительную декларацию gridinit() до main() и тебе будет хорошо идти.

Чтобы уточнить случай, в вашем main() функция, ты звонишь gridinit(), но до этого момента компилятор не имеет представления о прототипе gridinit() функция.

Из-за обратной совместимости, функция, называемая неявным объявлением функции, предполагает, что функция, которая использовалась до того, как была определена или объявлена, принимает любое количество параметров и возвращает int,

Позже, когда вы на самом деле определяете функцию, вы делаете тип возвращаемого значения как ListNode*, что создает конфликт здесь.

FWIW, в соответствии с C99 стандартно (далее), (злая) особенность неявного объявления функции была официально удалена, но компиляторы все еще продолжают поддерживать то же самое для унаследованного кода. Если вы включаете предупреждения компилятора и компилируете со строгим соответствием, ваш компилятор должен предупреждать (или даже останавливать), в случае, если отсутствует предварительное объявление.

Там должно быть объявление или определение 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;
}
Другие вопросы по тегам