정말 간단한 C언어 도움좀 부탁드리겠습니다
글쓴이: sacredone / 작성시간: 목, 2012/10/11 - 3:37오후
#include <stdio.h> char *test() { char *tmp; printf("test\n"); return tmp; } int main() { char *tmp; tmp = test(); return 0; }
하면 결과
test
로 문제없이 실행됩니다
근데 이걸 파일 두개로 만들어서
#include <stdio.h> char *test() { char *tmp; printf("test\n"); return tmp; }
위의 소스를 가지는 test1.c 와
#include <stdio.h> int main() { char *tmp; tmp = test(); return 0; }
위의 소스를 가지는 test2.c 를 만들고
gcc test1.c test2.c -o test
이렇게 하면
warning: assignment makes pointer from integer without a cast 라는 경고가 tmp = test(); 줄에 뜹니다
왜이런건지 설명해주실분 계신가요:?
Forums:
test의 원형이 없기 때문입니다.C에서는 원형이
test2.c에 test 함수의 원형이 없기 때문입니다.
C에서는 원형이 없는 함수에 대해서는 int를 반환하는 원형을 암묵적으로 선언합니다.
그렇기 때문에 호출된 test는 char *test()가 아니라 int test()이고, 따라서 int->char*로의 대입이라고 경고를 띄우는 겁니다.
혹시나 함수의 '원형'혹은 '프로토타입'이 무엇인지 모르신다면 입문서에서 함수 파트를 살펴보세요.
감사합니다 혹시 그러한 문제라면 저런경고 말고
감사합니다
혹시 그러한 문제라면 저런경고 말고 다른걸 띄어줄줄 알았는데 자꾸 인트를 포인터로 바꾸지말라고하니까 뭔가 싶었습니다
암묵적으로 원형이없고 다른파일에서 가져오는경우 int 를 리턴하는군요 감사합니다
아주 옛날에 처음 C 배울때가 생각나게 하는
아주 옛날에 처음 C 배울때가 생각나게 하는 코드네요.
저도 비슷한 고민을 했었던 것 같습니다.
앞의 분이 잘 설명해주셨지만 몇가지 추가답변 드리면요,
1. 하나의 파일로 있을때도 char *test() 함수를 main 아래쪽에 작성하면 아래의 경우와 동일한 상황이 됩니다.
사용하는 시점에서 그 함수의 원형을 모르는 경우 int가 가정됩니다.
2. 보여주신 코드의 경우 warning은 뜨지만 동작은 됩니다. 반환값을 안쓰니까요.
3. 반환값을 쓰는 경우 제대로 고치더라도,
tmp를 local변수로 선언하고 return합니다.
그런데 return하는 순간 스택에 있던 tmp는 없어지므로 오류의 원인이 됩니다.
4. 실행파일의 이름을 test로 만들고 실행을 그냥 test 로만 실행 하시면
/usr/bin/test 가 실행되는 경우도 있습니다. ./test로 실행하셔야합니다.
/usr/bin/test 은 아무 동작도 안하고 그냥 끝납니다. (이것때문에 몇시간 헤맸던 기억도 나네요 ㅎㅎ )
이미 아시는 내용일 수도 있겠습니다만,
옛날 생각이 나서 답변 달아 봅니다..
와.. 생각만 해도 끔찍하네요..
헐.. 지금 저도 해보고 놀랬습니다.
이런건 정말 운이 좋으면 금방 해결하지만,
나쁠때는 몇 시간씩 헤매게 하죠.. ㅜㅜ
댓글 달기