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호환되지 않는으로 간주됩니다 .) in malloc, a를 취하고 a) size_t를 반환합니다 void*.

5
용어 nit : C에 내장 된 함수와 같은 것은 없습니다. malloc은 단순히 표준 C 라이브러리의 함수입니다.
Jens

5
@Jens 표준 라이브러리 기능을 내장으로 언급하는 데 문제가 없다고 생각합니다. 오류 메시지가 "내장"이라는 단어를 사용했기 때문에 gcc 사람들도 분명히 그렇게하지 않습니다.
sepp2k

7
@ sepp2k 글쎄, 내가 문제를 참조하십시오. 사용법은 비표준입니다. 컴파일러 에는 내장 함수가있을 수 있으며 gcc에는 malloc이 내장되어있을 수 있습니다. 그러나 내가 쓴 것처럼 C 에는 내장 함수가 없습니다.
Jens

30

당신은하지 않았습니다 #include <stdlib.h>.


16

함수를 선언하는 헤더 파일을 포함해야합니다. 예를 들면 다음과 같습니다.

#include <stdlib.h>

이 헤더 파일을 포함하지 않으면 함수가 컴파일러에 알려지지 않습니다. 그래서 그것은 선언되지 않은 것으로 간주합니다.


10

도움을 받아 기능을 찾는 습관을들이십시오.

C에 대한 대부분의 도움말은 유닉스 매뉴얼 페이지에서 모델링됩니다.

사용 :

man malloc

매우 유용한 결과를 제공합니다.

인터넷 검색 man malloc은 내가 의미하는 바를 보여줄 것입니다.

유닉스에서는 관련된 것들에 대한 제안도 얻습니다.


1
#include <stdlib.h>시놉시스 의 줄 이 프로그램에 작성해야한다는 것을 이미 알고있는 경우에만 가능합니다 .
기계 달팽이

1
누군가 여기에서 다른 답변을 읽었다면 이제 알게 될 것입니다.
MikeKulls

0

다른 매우 좋은 답변 외에도 약간의 간단한 작업을 수행하고 다른 답변에서 아직 논의되지 않은 것을 다루고 싶습니다.


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.