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
prev 1 ··· 14 15 16 17 18 19 20 21 22 next