Tại sao tôi nhận được cảnh báo mỗi khi tôi sử dụng malloc?


110

Nếu tôi sử dụng mallocmã của mình:

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

Tôi nhận được cảnh báo này từ gcc:

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

Câu trả lời:


224

Bạn cần phải thêm:

#include <stdlib.h>

Tệp này bao gồm phần khai báo cho hàm tích hợp sẵn malloc. Nếu bạn không làm điều đó, trình biên dịch nghĩ rằng bạn muốn xác định hàm của riêng mình được đặt tên mallocvà nó cảnh báo bạn vì:

  1. Bạn không khai báo rõ ràng
  2. Đã có một hàm dựng sẵn có tên đó có chữ ký khác với chữ ký đã được khai báo ngầm (khi một hàm được khai báo ngầm, các kiểu trả về và đối số của nó được giả định là như vậy int, không tương thích với trong malloc, lấy a size_tvà trả về a void*).

5
Thuật ngữ nit: Không có cái gọi là hàm tích hợp trong C. malloc chỉ đơn giản là một hàm từ Thư viện C chuẩn.
Jens

5
@Jens Tôi không thấy có vấn đề gì khi đề cập đến các hàm thư viện tiêu chuẩn dưới dạng tích hợp sẵn - và những người gcc dường như cũng không vì thông báo lỗi cũng sử dụng từ "tích hợp sẵn" (đó là lý do tại sao tôi đã làm như vậy).
sepp2k 13/10/12

7
@ sepp2k Vâng, tôi làm thấy một vấn đề. Việc sử dụng không theo tiêu chuẩn. Các trình biên dịch có thể có các chức năng được tích hợp sẵn và gcc có thể được tích hợp sẵn malloc. Nhưng như tôi đã viết, trong C , không có chức năng tích hợp sẵn.
Jens


16

Bạn cần bao gồm tệp tiêu đề khai báo hàm, ví dụ:

#include <stdlib.h>

Nếu bạn không bao gồm tệp tiêu đề này, thì trình biên dịch không biết hàm. Vì vậy, nó coi nó là không được khai báo.


10

Tạo thói quen tìm kiếm chức năng của bạn khi được trợ giúp.

Hầu hết trợ giúp cho C được mô phỏng trên các trang hướng dẫn sử dụng unix.

Sử dụng:

man malloc

cho kết quả khá hữu ích.

Googling man mallocsẽ cho bạn thấy ý tôi.

Trong unix, bạn cũng nhận được apropos cho những thứ có liên quan.


1
Chỉ khi bạn đã biết rằng dòng #include <stdlib.h>trong phần tóm tắt nghĩa là bạn phải viết dòng đó vào chương trình của mình.
Ốc cơ

1
Nếu ai đó đã đọc các câu trả lời khác ở đây thì bây giờ họ sẽ biết điều đó.
MikeKulls

0

Bên cạnh những câu trả lời rất hay khác, tôi muốn thực hiện một chút ý kiến ​​và đề cập đến những điều chưa được thảo luận trong các câu trả lời khác.


Khi bạn ở Linux, Để sử dụng malloc()mã của bạn,

Bạn không thực sự phải làm như vậy #include <stdlib.h> .

(Mặc dù việc sử dụng stdlib.hlà rất phổ biến và có lẽ mọi chương trình không phải là chương trình đồ chơi đều nên bao gồm nó theo cách nào đó vì nó cung cấp một loạt các chức năng và macro thư viện chuẩn C hữu ích)

Bạn cũng có thể #include <malloc.h>thay thế.

Nhưng xin lưu ý rằng việc sử dụng malloc.hkhông còn được dùng nữa và nó làm cho mã của bạn không di động được. Nếu bạn muốn sử dụng, malloc()bạn nên luôn luôn và mãi mãi (ngoại trừ những lý do rõ ràng để làm khác) #include <stdlib.h>.

Lý do tại sao , được giải thích tốt nhất trong các câu trả lời cho câu hỏi này:

sự khác biệt giữa <stdlib.h> và <malloc.h>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.