Зачем мне нужно приводить структуру, возвращаемую из функции?

#c

#c

Вопрос:

В одном файле у меня есть это:

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

static struct node* mynode;

struct node*
example(void)
{
    mynode = malloc(sizeof(struct node));
    ...fill up the struct here...
    return mynode;
}
  

Вызывающая процедура:

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

int
main(void)
{
    mynode=example();
}
  

Сам узел определен в файле defs.h, который я здесь не показываю.
Предупреждение, которое я получаю при компиляции с помощью gcc, звучит так: «присваивание создает указатель из целого числа без приведения» в вызывающей процедуре.

Изменение на mynode=(struct node*)example(); удаляет это предупреждение. Процедура работает в любом случае, но я не понимаю, почему я получаю предупреждение.

Комментарии:

1. @JamesMorris — Да, я включил файл defs, но забыл свой заголовок.

Ответ №1:

Может быть, вы не объявили прототип для struct node* example(void) , и компилятор думает, что он возвращает an int ?

Ответ №2:

При вызове файла example возвращаемый тип example неизвестен, поэтому предполагается, что он возвращает значение int, которому вы присваиваете struct node * . Отсюда и предупреждение.

Вы должны либо объявить прототип for example в вызывающем файле (ввод struct node* example(void); перед вызывающей функцией), либо (лучше) создать файл заголовка с именем, скажем, example.h , где вы вводите прототип, а затем включаете файл заголовка в вызывающий файл (то есть ввод #include "example.h" at the top). The header file thus defines the interface of the file where example` являетсяlocated , и файлы, использующие функции, могут включать файл заголовка, что позволяет убедиться, что все типы совпадают, и удалить все предупреждения компилятора.

Комментарии:

1. Ого! И в этом проблема. У меня был заголовочный файл, но я его не включил. Спасибо.