pointer 를 call by referance 하기
Programming/C 2007. 4. 9. 23:18
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 }
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
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 }
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일 수정
'Programming > C' 카테고리의 다른 글
세그멘테이션 폴트를 줄이자! valgrind (4) | 2007.05.08 |
---|---|
c언어로 구현한 mp3 태그(id3v2) 지우기 (6) | 2007.05.06 |
프로세스 갯수 알아내기.. (4) | 2007.03.06 |
libconfuse 에서 *** glibc detected *** double free or corruption (0) | 2007.02.22 |
iconv 함수 사용법.?! (0) | 2006.12.15 |