Чому я отримую попередження щоразу, коли використовую 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

Відповіді:


224

Вам потрібно додати:

#include <stdlib.h>

Цей файл містить декларацію для вбудованої функції malloc. Якщо цього не зробити, компілятор вважає, що ви хочете визначити свою власну функцію з назвою, mallocі це попереджає вас, оскільки:

  1. Ви не заявляєте це прямо та
  2. Вже є вбудована функція під цим ім'ям, яка має інший підпис, ніж та, яка була неявно оголошена (коли функція неявно оголошена, вважаються типи її повернення та аргументу int, що не сумісні зі вбудованими- в malloc, який приймає a size_tі повертає a void*).

5
Термінологія nit: Не існує такого поняття, як вбудована функція у C. malloc - це просто функція з бібліотеки Standard C.
Єнс

5
@Jens Я не бачу проблем із посиланням на стандартні функції бібліотеки як на вбудовані пристрої - і, мабуть, не користуються gcc люди, оскільки повідомлення про помилку також використовувало слово "вбудований" (саме тому я це і зробив).
sepp2k

7
@ Sepp2k Ну, я зробити бачу проблему. Використання нестандартне. Компілятори можуть мати вбудовані функції, а в gcc може бути вбудований malloc. Але як я писав, в C немає вбудованих функцій.
Єнс


16

Вам потрібно включити заголовок, який оголошує функцію, наприклад:

#include <stdlib.h>

Якщо ви не включите цей файл заголовка, функція не відома компілятору. Тому він вважає це незадекларованим.


10

Створіть звичку шукати свої функції на допомогу.

Більшість довідки для C моделюється на сторінках керівництва Unix.

Використання:

man malloc

дає досить корисні результати.

Гуглінг man mallocпокаже, що я маю на увазі.

У unix ви також отримуєте підходи для речей, які пов'язані між собою.


1
Тільки якщо ви вже знаєте, що рядок #include <stdlib.h>у конспекті означає, що ви повинні це записати у своїй програмі.
Механічний равлик

1
Якщо хтось прочитав інші відповіді тут, то тепер це знатиме.
MikeKulls

0

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


Коли ви перебуваєте в Linux, щоб використовувати malloc()свій код,

Ви насправді не повинні #include <stdlib.h> .

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

Ви також можете #include <malloc.h>замість цього.

Але зауважте, що використання malloc.hзастаріло, і це робить ваш код не портативним. Якщо ви хочете використовувати, malloc()ви повинні завжди і будь-коли (за винятком явних причин робити інше) #include <stdlib.h>.

Причини, чому , найкраще пояснюються у відповідях на це питання:

різниця між <stdlib.h> і <malloc.h>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.