Malloc'u her kullandığımda neden uyarı alıyorum?


110

Kodumda kullanırsam malloc:

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

Bu uyarıyı şuradan alıyorum gcc:

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

Yanıtlar:


224

Eklemeniz gerekiyor:

#include <stdlib.h>

Bu dosya, yerleşik işlevin bildirimini içerir malloc. Bunu yapmazsanız, derleyici adında kendi işlevinizi tanımlamak istediğinizi düşünür mallocve sizi uyarır çünkü:

  1. Açıkça beyan etmiyorsunuz ve
  2. Bu isme göre, örtük olarak bildirilenden farklı bir imzaya sahip yerleşik bir işlev zaten vardır (bir işlev örtük olarak bildirildiğinde, dönüş ve argüman türlerinin olduğu varsayılır int, bu yerleşik işlevle uyumlu değildir. in malloc, a alır size_tve a void*) döndürür .

5
Terminoloji nit: C.'de yerleşik bir işlev diye bir şey yoktur. Malloc, sadece Standart C Kitaplığındaki bir işlevdir.
Jens

5
@Jens Standart kütüphane işlevlerine yerleşik olarak atıfta bulunmakla ilgili bir sorun görmüyorum - ve görünüşe göre gcc çalışanları da hata mesajı "yerleşik" kelimesini kullandığından (bu yüzden yaptım).
sepp2k

7
@ sepp2k Eh, ben bunu bir sorun göremiyorum. Kullanım standart değildir. Derleyicilerin yerleşik işlevleri olabilir ve gcc'de yerleşik malloc bulunabilir. Ama yazdığım gibi , C'de yerleşik işlevler yok.
Jens


16

İşlevi açıklayan başlık dosyasını eklemeniz gerekir, örneğin:

#include <stdlib.h>

Bu başlık dosyasını dahil etmezseniz, işlev derleyici tarafından bilinmez. Yani bunu beyan edilmemiş olarak görüyor.


10

Yardımda işlevlerinize bakmayı alışkanlık haline getirin.

C için çoğu yardım, unix kılavuz sayfalarında modellenmiştir.

Kullanarak:

man malloc

oldukça faydalı sonuçlar verir.

Google man mallocsize ne demek istediğimi gösterecek.

Unix'te, ilgili şeyler için de uygunluk elde edersiniz.


1
Sadece #include <stdlib.h>özetteki satırın bunu programınızda yazmanız gerektiği anlamına geldiğini zaten biliyorsanız .
Mechanical snail

1
Birisi burada diğer cevapları okuduysa, şimdi bunu bileceklerdir.
MikeKulls

0

Diğer çok iyi cevapların yanı sıra, biraz özür dilemek ve diğer cevaplarda henüz tartışılmayan bir şeyi ele almak istiyorum.


Linux'tayken, malloc()kodunuzda kullanmak için,

Aslında zorunda değilsin #include <stdlib.h>.

(Her ne kadar kullanımı stdlib.hçok yaygın olsa da ve muhtemelen oyuncak olmayan her program onu ​​her iki şekilde de içermelidir çünkü çok çeşitli kullanışlı C standart kütüphane işlevleri ve makroları sağlar)

Bunun #include <malloc.h>yerine sen de yapabilirsin .

Ancak, kullanımının kullanımdan malloc.hkaldırıldığını ve kodunuzu taşınabilir hale getirmediğini lütfen unutmayın . Kullanmak istiyorsanız malloc(), her zaman ve her zaman kullanmalısınız (aksini yapmak için açık nedenler dışında) #include <stdlib.h>.

Nedenleri neden , iyi Bu sorunun yanıtları açıklanmıştır:

<stdlib.h> ve <malloc.h> arasındaki fark

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.