pointer 를 call by referance 하기

  1 #include<stdio.h>
  2 #include<malloc.h>
  3
  4 struct choco
  5 {
  6     int a;
  7     int b;
  8     int c;
  9 };
 10
 11 void me(struct choco* *fk)  //main에서 void(?) 넘긴걸 "struct choco *" 형으로 받는다
 12 {
 13     struct choco *abc;
 14     int i;
 15
 16     printf("func call value : %p\n",*fk);
 17     printf("func call momory address : %p \n",fk);
 18      //이 함수가 끝나더라고 malloc의 메모리는 해제되지 않는다..
 19     abc=(struct choco *)malloc(sizeof(struct choco)*3);
 20
 21     abc[0].a=1;
 22     abc[0].b=2;
 23     abc[0].c=3;
 24
 25     abc[1].a=11;
 26     abc[1].b=22;
 27     abc[1].c=33;
 28
 29     abc[2].a=111;
 30     abc[2].b=222;
 31     abc[2].c=333;
 32
 33     for(i=0;i<3;i++)
 34         printf("func pointer memory (struct) value %d : %d %d %d \n",i,abc[i].a,abc[i].b,abc[i].c);
 35
 36     puts("\n");
 37   
 38     *fk=abc; //이게좀 했갈렸다..
 39 }
 40
 41 int main(void)
 42 {
 43     struct choco *po;
 44     int i;
 45
 46     po=NULL;
 47
 48     printf("Before pointer value : %p \n",po);
 49     printf("Before pointer memory address : %p\n",&po);
 50     puts("\n");
 51    
 52     me(&po);    // void로 값을 넘긴다
 53    
 54     printf("After pointer value : %p \n",po); //요값은 아까 struct choco  *abc의 값!
 55
 56     for(i=0;i<3;i++) //당연히 free되지 않았으므로.. .가능 .. 값을 뿌려줌..
 57         printf("After pointer memory (struct) value %d : %d %d %d \n",i,po[i].a,po[i].b,po[i].c);
 58     puts("\n");
 59
 60     //free가 제대로 앙대 ㅜㅜ(일단 패스)
 61     free(po);
 62
 63     return 0;
 64 }

결과
Before pointer value : (nil)
Before pointer memory address : 0xbff28ac8


func call value : (nil)
func call momory address : 0xbff28ac8
func pointer memory (struct) value 0 : 1 2 3
func pointer memory (struct) value 1 : 11 22 33
func pointer memory (struct) value 2 : 111 222 333


After pointer value : 0x804a008
After pointer memory (struct) value 0 : 1 2 3
After pointer memory (struct) value 1 : 11 22 33
After pointer memory (struct) value 2 : 111 222 333



:cw
Press ENTER or type command to continue

더 간단 버전.. 즉 앞에한짓은 뻘짓이라는게 증명됨(??)
  1 #include<stdio.h>
  2 #include<malloc.h>
  3
  4 truct choco
  5 {
  6     int a;
  7     int b;
  8     int c;
  9 }; 
 10
 11 struct choco* me(void)
 12 {
 13     struct choco *abc;
 14     int i;
 15    
 16     abc=(struct choco *)malloc(sizeof(struct choco)*3);
 17    
 18     abc[0].a=1;
 19     abc[0].b=2;
 20     abc[0].c=3;
 21    
 22     abc[1].a=11;
 23     abc[1].b=22;
 24     abc[1].c=33;
 25
 26     abc[2].a=111;
 27     abc[2].b=222;
 28     abc[2].c=333;
 29
 30     for(i=0;i<3;i++)
 31         printf("func pointer memory (struct) value %d : %d %d %d \n",i,abc[i].a,abc[i].b,abc[i].c);
 32        
 33     puts("\n");
 34   
 35     return abc;
 36 }  
 37
 38 int main(void)
 39 {
 40     struct choco *po;
 41     int i;
 42    
 43     po=NULL;
 44    
 45     printf("Before pointer value : %p \n",po);
 46     printf("Before pointer memory address : %p\n",&po);
 47     puts("\n");
 48    
 49     po=me();
 50    
 51     printf("After pointer value : %p \n",po);
 52    
 53     for(i=0;i<3;i++)
 54         printf("After pointer memory (struct) value %d : %d %d %d \n",i,po[i].a,po[i].b,po[i].c);
 55     puts("\n");
 56    
 57     free(po);
 58 }  

어짜피 malloc은 static과 같이 값이 유지되므로 결론적으로
"값만 받아내면 된다" 그래서 사용하는것도 같이 사용..

내가 free를 많이 안해봐서 몰랐는데
구조체 포인터라고 할지라도 그냥 free하고 포인터네임만 쓰면 되는거 같다(위엔,1차원이므로)
그런데 신기하게도(?) free한다음 for문을 돌려서 안에 내용을 확인하면 포인터 네임 위치만 NULL
이 되어있고 나머지 값들은 다 유지한 상태로 되있다 -_-;
딴 프로그램에서도 이런식으로  free를 했길래 위에 free방법이 틀리지 않은거 같은데..
값은 아니네.. 이상함..;;

4,19일 수정
Trackback 0 Comment 6
  1. Favicon of http://blog.naver.com/khmirage.do BlogIcon 환상경 2007.04.10 14:39 address edit & del reply

    천재~!!!

    malloc로 선언했다고 하더라도 함수벗어나면 못쓰게 되는거라 생각했었는데
    아니었었나보군요 -0-
    알면알수록 어려운 C.............

    • lowid 2007.04.11 17:18 address edit & del

      거봐염 쓸수 있잖아요 ~ =3

      하지만 귀찮은건 역시 free해주기..
      (뭐 자동으로 해준다고는 하지만 .그래도..)

  2. Favicon of http://sakuragi.org BlogIcon sakuragi 2007.04.14 17:51 address edit & del reply

    저도 그 free 부분에서 궁금한게.. main 함수가 아닌
    int** func(int **a)
    같은 함수 내부에서 int **b 형태도 선언해서 malloc으로 메모리 할당 한 후에
    그 b를 return 해 버린다면 free 할 기회가 없어진다고 생각 되는데 이때는 어떻게 해야 되는 거죠?
    return 을 받은 녀석을 int **c 라고 가정하면 c 를 free 하면 해결되는 걸까요? -_-;;
    뭐.. 자동으로 해준다고는 하지만요.. 뭔가... ㅜㅡ

    • lowid 2007.04.19 18:22 address edit & del

      걍포인터던 이중포인터던 어짜피 malloc하면 힙(영역이던가?)
      영역에 데이터가 생성(메모리 유지)되므로 값만 받아서 free시켜주면 될듯합니다..
      즉 받아서 (2중포인터로 받았다면)main함수에서 2중포인터 free해주듯이 그func함수에서 리턴받은 값도 마찬가지로 처리하면 될거 같아요..;;(결론적으로 sakuragi님 말대로 될거 같다는)
      (틀릴수도 있으니깐 너무 믿진마시고; )
      덧>다시 작성한 위글이 도움이 될지도.

  3. Favicon of http://blog.naver.com/khmirage.do BlogIcon 환상경 2007.04.16 08:50 address edit & del reply

    garbage collector 최고 ~
    포인터 훼~
    물러가라 포인터~

    • lowid 2007.04.19 00:41 address edit & del

      타도! 포인터!
      (하지만 쓸수 밖에 없다는 orz..)

prev 1 ··· 14 15 16 17 18 19 20 21 22 next