참조에 의한 값전달.

하하의 이미지


void a(char* test) {

        test = (char *)malloc(sizeof(char));

}


main()
{
        char *test=0x00;

        printf("1. %x \n", test);


        a(test);


        printf("2. %x \n", test);

}

위 main에서 test를 a 함수로 주소값을 넘겼습니다

a 함수 수행 후...

main 복귀해서 test를 찍어보면 a에서 할당 받은

test의 주소가 안찍힙니다.

헐.. 이런.. 것도 몰라.. 생각없는넘 할거 같은데...

정말 안되는데.. 어떻게 생각하십니다.

linux , gcc 환경입니다...

즐거운 하루되세요....

맹고이의 이미지

char *test의 주소값이 넘어가야 되니...

void a(char **test);

가 되어야 되지 않나요?

eminency의 이미지

윗분이 올려주신 링크에 여러 분들이 설명을 달아주시긴 했지만...
기본적으로는 C가 Call by value이기 때문이라고 봅니다.

main()
{
  int a = 1;
  test(a);
  printf("%d\n",a);
}

void test(int a)
{
    a = 100;
}

위의 프로그램에서도 프린트 되는 값은 100이 아니라 1입니다. 이유는 다 아실 것입니다. 포인터도 마찬가지입니다.
위에서 int 대신 포인터를 매개변수로 넘겨준다면 포인터가 가리키는 주소값을 Call by value로 넘겨주는 것 뿐이기 때문에 함수에서 아무리 malloc하고 해서 주소값을 바꿔도 함수 호출이 끝나면 malloc으로 받은 주소값은 날아가 버리는 것입니다. 함수 내부에서 만들어진(여기서는 malloc이 리턴한) 주소값도 stack에 저장되는 로컬 변수값이 되는 셈이니 함수 끝나면 사라지는 거죠.

주소값을 return 해주거나 맹고이님이 쓰신 것처럼 더블 포인터를 쓰는 방법, 그리고 -별로 권장하진 않지만- 전역변수로 해결하는 방법등으로 해야만 원하시는 작업이 가능할 것입니다.

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

mastercho의 이미지

C++ 방식대로라면 지저분한 2중포인터를 쓰느니

void a(char *& test);

가 좋을듯

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

Fe.head의 이미지

API 실전 프로그램에서

 a (char *&ch)

가 나왔는데.. 책 오타인줄 알고..
그냥 포인터로 바꾸어서 했는데..

이것때문에 프로그램에 이상이 생겨.. 2.3시간동안 고생한 생각이 나네요..

C언어니깐. 이중 포인터로 하면 해결 되겠죠...


void a(char** test) {

        *test = (char *)malloc(sizeof(char));

}


main()
{
        char *test=0x00;

        printf("1. %x \n", test);


        a(&test);


        printf("2. %x \n", test);

}

고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.