정말 간단한 C언어 도움좀 부탁드리겠습니다

sacredone의 이미지

#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(); 줄에 뜹니다

왜이런건지 설명해주실분 계신가요:?

klara의 이미지

test2.c에 test 함수의 원형이 없기 때문입니다.
C에서는 원형이 없는 함수에 대해서는 int를 반환하는 원형을 암묵적으로 선언합니다.
그렇기 때문에 호출된 test는 char *test()가 아니라 int test()이고, 따라서 int->char*로의 대입이라고 경고를 띄우는 겁니다.

혹시나 함수의 '원형'혹은 '프로토타입'이 무엇인지 모르신다면 입문서에서 함수 파트를 살펴보세요.

sacredone의 이미지

감사합니다

혹시 그러한 문제라면 저런경고 말고 다른걸 띄어줄줄 알았는데 자꾸 인트를 포인터로 바꾸지말라고하니까 뭔가 싶었습니다

암묵적으로 원형이없고 다른파일에서 가져오는경우 int 를 리턴하는군요 감사합니다

qiiiiiiiip의 이미지

아주 옛날에 처음 C 배울때가 생각나게 하는 코드네요.
저도 비슷한 고민을 했었던 것 같습니다.
앞의 분이 잘 설명해주셨지만 몇가지 추가답변 드리면요,

1. 하나의 파일로 있을때도 char *test() 함수를 main 아래쪽에 작성하면 아래의 경우와 동일한 상황이 됩니다.
사용하는 시점에서 그 함수의 원형을 모르는 경우 int가 가정됩니다.

2. 보여주신 코드의 경우 warning은 뜨지만 동작은 됩니다. 반환값을 안쓰니까요.

3. 반환값을 쓰는 경우 제대로 고치더라도,
tmp를 local변수로 선언하고 return합니다.
그런데 return하는 순간 스택에 있던 tmp는 없어지므로 오류의 원인이 됩니다.

4. 실행파일의 이름을 test로 만들고 실행을 그냥 test 로만 실행 하시면
/usr/bin/test 가 실행되는 경우도 있습니다. ./test로 실행하셔야합니다.
/usr/bin/test 은 아무 동작도 안하고 그냥 끝납니다. (이것때문에 몇시간 헤맸던 기억도 나네요 ㅎㅎ )

이미 아시는 내용일 수도 있겠습니다만,
옛날 생각이 나서 답변 달아 봅니다..

addnull의 이미지

Quote:

4. 실행파일의 이름을 test로 만들고 실행을 그냥 test 로만 실행 하시면
/usr/bin/test 가 실행되는 경우도 있습니다. ./test로 실행하셔야합니다.
/usr/bin/test 은 아무 동작도 안하고 그냥 끝납니다. (이것때문에 몇시간 헤맸던 기억도 나네요 ㅎㅎ )

헐.. 지금 저도 해보고 놀랬습니다.
이런건 정말 운이 좋으면 금방 해결하지만,
나쁠때는 몇 시간씩 헤매게 하죠.. ㅜㅜ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.