Почему я получаю предупреждение каждый раз, когда использую malloc?

110

Если я использую mallocв своем коде:

int *x = malloc(sizeof(int));

Я получаю это предупреждение от gcc:

new.c:7: warning: implicit declaration of function malloc  
new.c:7: warning: incompatible implicit declaration of built-in function malloc
Kredns
источник

Ответы:

224

Вам необходимо добавить:

#include <stdlib.h>

Этот файл включает объявление встроенной функции malloc. Если вы этого не сделаете, компилятор решит, что вы хотите определить свою собственную функцию с именем, mallocи предупредит вас, потому что:

  1. Вы не заявляете об этом явно и
  2. Уже существует встроенная функция с этим именем, которая имеет сигнатуру, отличную от той, которая была неявно объявлена ​​(когда функция объявляется неявно, предполагается int, что ее возвращаемый тип и типы аргументов не совместимы со встроенным in malloc, который принимает a size_tи возвращает a void*).
sepp2k
источник
5
Нит терминологии: в C. нет такой вещи, как встроенная функция. Malloc - это просто функция из стандартной библиотеки C.
Йенс
5
@Jens. Я не вижу проблемы с упоминанием стандартных библиотечных функций как встроенных, как и люди из gcc, очевидно, поскольку в сообщении об ошибке тоже используется слово «встроенный» (вот почему я так и сделал).
sepp2k
7
@ sepp2k Ну, я сделать вижу проблему. Использование нестандартное. Компиляторы могут иметь встроенные функции, а gcc может иметь встроенный malloc. Но как я уже писал, в C нет встроенных функций.
Йенс
30

Вы еще не сделали #include <stdlib.h>.

хаос
источник
16

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

#include <stdlib.h>

Если вы не включите этот файл заголовка, функция не известна компилятору. Поэтому он считает это необъявленным.

андри
источник
10

Возьмите за привычку искать свои функции в справке.

Большая часть справки для C смоделирована на страницах справочника unix.

С помощью :

man malloc

дает довольно полезные результаты.

Поиск в Google man mallocпокажет вам, что я имею в виду.

В unix вы также получаете информацию о связанных между собой вещах.

Тим Уиллискрофт
источник
1
Только если вы уже знаете, что строка #include <stdlib.h>в синопсисе означает, что вы должны записать это в своей программе.
Механическая улитка
1
Если кто-то читал здесь другие ответы, то теперь они это знают.
MikeKulls
0

Помимо других очень хороших ответов, я хотел бы сделать небольшую придирку и затронуть то, что еще не обсуждается в других ответах.


Когда вы работаете в Linux, чтобы использовать malloc()в своем коде,

На самом деле это не обязательно #include <stdlib.h> .

(Хотя использование stdlib.hочень распространено и, вероятно, каждая программа, не являющаяся игрушечной, должна включать его в любом случае, потому что она предоставляет широкий спектр полезных функций стандартной библиотеки C и макросов)

Вы также могли бы #include <malloc.h>вместо этого.

Но обратите внимание, что использование malloc.hне рекомендуется, и это делает ваш код непереносимым. Если вы хотите использовать, malloc()вы должны всегда и всегда (за исключением явных причин, чтобы сделать иначе) #include <stdlib.h>.

Причины почему лучше всего объясняются в ответах на этот вопрос:

разница между <stdlib.h> и <malloc.h>

RobertS поддерживает Монику Челлио
источник