Mengapa saya mendapat peringatan setiap kali menggunakan malloc?

110

Jika saya menggunakan mallockode saya:

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

Saya mendapatkan peringatan ini dari gcc:

new.c:7: warning: implicit declaration of function malloc  
new.c:7: warning: incompatible implicit declaration of built-in function malloc
Kredns
sumber

Jawaban:

224

Anda perlu menambahkan:

#include <stdlib.h>

File ini menyertakan deklarasi untuk fungsi built-in malloc. Jika Anda tidak melakukannya, kompilator berpikir Anda ingin mendefinisikan fungsi Anda sendiri bernama mallocdan ia memperingatkan Anda karena:

  1. Anda tidak secara eksplisit mendeklarasikannya dan
  2. Sudah ada fungsi built-in dengan nama itu yang memiliki tanda tangan berbeda dari yang dideklarasikan secara implisit (ketika sebuah fungsi dideklarasikan secara implisit, tipe kembalian dan argumennya diasumsikan int, yang tidak kompatibel dengan built- in malloc, yang mengambil a size_tdan mengembalikan a void*).
sepp2k.dll
sumber
5
Terminologi nit: Tidak ada yang namanya fungsi bawaan di C. malloc hanyalah fungsi dari Perpustakaan C Standar.
Jens
5
@ Jens Saya tidak melihat masalah dengan merujuk ke fungsi perpustakaan standar sebagai built-in - dan begitu pula orang-orang gcc karena pesan kesalahan menggunakan kata "built-in", juga (itulah sebabnya saya melakukannya).
sepp2k
7
@ sepp2k Yah, aku lakukan melihat masalah. Penggunaannya tidak standar. Kompiler dapat memiliki fungsi bawaan, dan gcc mungkin memiliki malloc bawaan. Tapi seperti yang saya tulis, di C , tidak ada fungsi bawaan.
Jens
30

Anda belum selesai #include <stdlib.h>.

kekacauan
sumber
16

Anda perlu menyertakan file header yang mendeklarasikan fungsi tersebut, misalnya:

#include <stdlib.h>

Jika Anda tidak menyertakan file header ini, fungsinya tidak dikenal oleh compiler. Jadi itu melihatnya sebagai tidak dideklarasikan.

andri
sumber
10

Biasakan mencari fungsi Anda untuk membantu.

Kebanyakan bantuan untuk C dimodelkan pada halaman manual unix.

Menggunakan:

man malloc

memberikan hasil yang sangat berguna.

Googling man mallocakan menunjukkan kepada Anda apa yang saya maksud.

Di unix Anda juga mendapatkan tawaran untuk hal-hal yang terkait.

Tim Williscroft
sumber
1
Hanya jika Anda sudah tahu bahwa baris #include <stdlib.h>di sinopsis berarti Anda harus menuliskannya di program Anda.
Siput mekanik
1
Jika seseorang telah membaca jawaban lain di sini maka mereka sekarang akan tahu itu.
MikeKulls
0

Selain jawaban yang sangat bagus lainnya, saya ingin melakukan sedikit rewel dan membahas sesuatu yang belum dibahas di jawaban lain.


Saat Anda berada di Linux, Untuk menggunakan malloc()kode Anda,

Anda sebenarnya tidak perlu melakukannya #include <stdlib.h> .

(Meskipun penggunaan stdlib.hsangat umum dan mungkin setiap program non-mainan harus menyertakannya dengan cara apa pun karena ini menyediakan berbagai fungsi dan makro pustaka standar C yang berguna)

Anda juga bisa #include <malloc.h>.

Namun harap diperhatikan bahwa penggunaan dari malloc.hsudah usang dan membuat kode Anda non-portabel. Jika Anda ingin menggunakan malloc()Anda harus selalu dan selamanya (kecuali untuk alasan eksplisit untuk melakukan sebaliknya) #include <stdlib.h>.

Alasan mengapa , sebaiknya dijelaskan dalam jawaban atas pertanyaan ini:

perbedaan antara <stdlib.h> dan <malloc.h>

RobertS mendukung Monica Cellio
sumber