เหตุใดฉันจึงได้รับคำเตือนทุกครั้งที่ใช้ 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
ศัพท์บัญญัติ: ไม่มีสิ่งที่เรียกว่าฟังก์ชันในตัวใน C. malloc เป็นเพียงฟังก์ชันจาก Standard C Library
Jens

5
@ เจนส์ฉันไม่เห็นปัญหาในการอ้างถึงฟังก์ชันไลบรารีมาตรฐานเป็นแบบบิวท์อิน - และไม่เห็นได้ชัดว่าคน gcc ทั้งคู่เนื่องจากข้อความแสดงข้อผิดพลาดใช้คำว่า "built-in" ด้วย (ซึ่งเป็นสาเหตุที่ฉันทำ)
sepp2k

7
@ sepp2k ดีฉันทำดูปัญหา การใช้งานไม่ได้มาตรฐาน คอมไพเลอร์สามารถมีฟังก์ชันในตัวและ gcc อาจมี malloc ในตัว แต่อย่างที่เขียนไว้ใน Cไม่มีฟังก์ชันในตัว
Jens


16

คุณต้องรวมไฟล์ส่วนหัวที่ประกาศฟังก์ชันตัวอย่างเช่น:

#include <stdlib.h>

หากคุณไม่รวมไฟล์ส่วนหัวนี้คอมไพลเลอร์จะไม่รู้จักฟังก์ชันนี้ ดังนั้นจึงเห็นว่าไม่มีการประกาศ


10

สร้างนิสัยในการค้นหาหน้าที่ของคุณด้วยความช่วยเหลือ

วิธีใช้ส่วนใหญ่สำหรับ C ถูกสร้างแบบจำลองในหน้าคู่มือการใช้งานของยูนิกซ์

ใช้:

man malloc

ให้ผลลัพธ์ที่มีประโยชน์มาก

Googling man mallocจะแสดงให้คุณเห็นว่าฉันหมายถึงอะไร

ใน unix คุณจะได้รับ apropos สำหรับสิ่งที่เกี่ยวข้อง


1
เฉพาะในกรณีที่คุณรู้อยู่แล้วว่าบรรทัด#include <stdlib.h>ในเรื่องย่อหมายความว่าคุณต้องเขียนสิ่งนั้นในโปรแกรมของคุณ
หอยทาก

1
หากมีคนอ่านคำตอบอื่น ๆ ที่นี่ตอนนี้พวกเขาจะรู้แล้ว
MikeKulls

0

นอกจากคำตอบที่ดีอื่น ๆ แล้วฉันต้องการทำ nitpick เล็กน้อยและครอบคลุมสิ่งที่ยังไม่ได้กล่าวถึงในคำตอบอื่น ๆ


เมื่อคุณอยู่ที่ Linux หากต้องการใช้malloc()ในโค้ดของคุณ

คุณไม่จริงต้อง #include <stdlib.h>

(แม้ว่าการใช้งานstdlib.hจะเป็นเรื่องธรรมดามากและอาจเป็นไปได้ว่าทุกโปรแกรมที่ไม่ใช่ของเล่นควรรวมไว้ด้วยวิธีใดวิธีหนึ่งเนื่องจากมีฟังก์ชันไลบรารีมาตรฐาน C และมาโครที่มีประโยชน์มากมาย)

คุณสามารถ#include <malloc.h>แทนได้

แต่โปรดทราบว่าการใช้งานmalloc.hนั้นเลิกใช้แล้วและทำให้โค้ดของคุณไม่สามารถพกพาได้ หากคุณต้องการที่จะใช้malloc()คุณควรเสมอและตลอดไป #include <stdlib.h>(ยกเว้นเหตุผลอย่างชัดเจนที่จะทำอย่างอื่น)

เหตุผลที่ว่าทำไมมีการอธิบายที่ดีที่สุดในคำตอบของคำถามนี้:

ความแตกต่างระหว่าง <stdlib.h> และ <malloc.h>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.