함수내에서 더블포인터를 인자로 주었을시에...알수없는 오류
글쓴이: jongyoungcha / 작성시간: 금, 2012/11/23 - 12:08오전
#include
#include
void memory(int num, int **pp){
pp = (int*)malloc(sizeof(int)*4);
*pp[0] = 1;
*pp[1] = 2;
*pp[2] = 3;
}
int main(){
int num = 8;
int* p = NULL;
memory(num, p);
return 0;
}
이부분에서 더블포인터를 사용해서 하면 오류가 납니다.
그러나 함수내에서 인자값에 더블 포인터가 아니라 그냥 포인터를 올리면 에러가 나지 않는데요
이것이 왜 그런것 인가요.... 부탁드려용 ㅠ
Forums:


냉 그렇습니다
여기서 더블 포인터를 써서 동적할당을 할 때 까지는 에러가 나지 않지만
저 포인터 값에 정수 값을 넣어주면 그대로 에러가 나게 됩니다. 왜그런지 알 수 있을까요? ㅠㅠ
&p, *pp 겠죠. 컴파일러 메시지만 잘 읽어도
&p, *pp 겠죠.
컴파일러 메시지만 잘 읽어도 대부분 문제는 풀릴텐데.....
아 맞긴합니다만
아 죄송합니다 저기 memory 함수 호출 부분은 memory(num, &p);입니다. 죄송합니다. 하지만 제가 질문 드리고 싶은 부분은 저게 아니라
저기 함수에 인자인 **pp는 포인터 포인터 변수를 가리키는 변수입니다. 따라서 인자에 값을 대입하면 **pp = &p 이므로
결국 *pp의 값은 main에 선언한 *p가 가르키는 변수의 주소값을 가르키는 결로 알고있습니다 따라서
int *p;
p = (int*)malloc(sizeof(int));
이거나
int *p;
int **pp = &p;
*pp = (int*)malloc(sizeof(int));
이거나 같은 연산이 아닌가 싶은데
코드를 돌려보면 알 수 없는 에러라고 하면서 종료가 됩니다. 이부분이 전 정말 이해가 되지 않아서요 ㅠ
*p = malloc p[0] = 1 에 대응되는
에 대응되는 코드는
이겠지요..
실질적으로 함수내에서 malloc할당을 할때는 문제가
실질적으로 함수내에서 malloc할당을 할때는 문제가 생기지 않습니다만은
함수내에서 할당된 값에 정수를 대입할때는 에러가 납니다. ㅠ
이렇게 사용하나 봅니다.
포인터를 함수인자값에서 참조하기 위해서는. &를 사용해야 하는데. 그걸 잘 못해서. 외부에서 malloc 해줬습니다.
함수 내부에서 malloc 하고 싶다면. return 값으로 주어도 되어 보입니다.
아니면. 그냥 & 인자가 되는 포인터 하나만 별도로 주어도 될것 같습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> //strlen memset void fn_ref(int num, int **p) { int size = sizeof(int); int n = 0; // p 주소 // *p 값 // **p 값의 주소 printf("fn_ref()---------\n"); printf("p 주소 : %x\n", p); printf("&*p 주소 : %x\n", &*p); printf("*p 주소 : %x\n", *p); printf("&p 주소 : %x\n", &p); // printf("%x\n", **p); //죽는다. n = 1; memcpy(&p[0], &n, size); // *(p+0) = (int*)n; // *(&p[0]) = (int*)n; n = 2; // memcpy(&p[1], &n, size); *(p+1) = (int*)n; // *(&p[1]) = (int*)n; n = 3; // memcpy(&p[2], &n, size); // *(p+2) = (int*)n; *(&p[2]) = (int*)n; printf("%d %d\n", *(&p[0]), *(p+0)); printf("%d %d\n", *(&p[1]), *(p+1)); printf("%d %d\n", *(&p[2]), *(p+2)); } int** fn_noref(int num, int **p, int& t) { int size = sizeof(int); p = (int**)malloc(size*4); memset(p, '\0', size*4); int n = 0; // p 주소 // *p 값 // **p 값의 주소 printf("fn_noref()---------\n"); printf("p 주소 : %x\n", p); printf("&*p 주소 : %x\n", &*p); printf("*p 주소 : %x\n", *p); printf("&p 주소 : %x\n", &p); // printf("%x\n", **p); //죽는다. n = 4; memcpy(&p[0], &n, size); // *(p+0) = (int*)n; // *(&p[0]) = (int*)n; n = 5; // memcpy(&p[1], &n, size); *(p+1) = (int*)n; // *(&p[1]) = (int*)n; n = 6; // memcpy(&p[2], &n, size); // *(p+2) = (int*)n; *(&p[2]) = (int*)n; printf("%d %d\n", *(&p[0]), *(p+0)); printf("%d %d\n", *(&p[1]), *(p+1)); printf("%d %d\n", *(&p[2]), *(p+2)); t = (int)p; return p; } int main() { int num = 8; int** p = NULL; // int size = sizeof(int); p = (int**)malloc(size*4); memset(p, '\0', size*4); fn_ref(num, p); printf("\n"); printf("main----------\n"); printf("p 주소 : %x\n", p); printf("&*p 주소 : %x\n", &*p); printf("*p 주소 : %x\n", *p); printf("&p 주소 : %x\n", &p); // printf("%d %d\n", *(&p[0]), *(p+0)); printf("%d %d\n", *(&p[1]), *(p+1)); printf("%d %d\n", *(&p[2]), *(p+2)); printf("\n"); free(p); p = NULL; // int t; p = fn_noref(num, p, t); p = (int**)t; printf("\n"); printf("main----------\n"); printf("p 주소 : %x\n", p); printf("&*p 주소 : %x\n", &*p); printf("*p 주소 : %x\n", *p); printf("&p 주소 : %x\n", &p); // printf("%d %d\n", *(&p[0]), *(p+0)); printf("%d %d\n", *(&p[1]), *(p+1)); printf("%d %d\n", *(&p[2]), *(p+2)); printf("\n"); free(p); p = NULL; return 0; } //출력 결과 // //fn_ref()--------- //p 주소 : 373930 //&*p 주소 : 373930 //*p 주소 : 0 //&p 주소 : 12ff24 //1 1 //2 2 //3 3 // //main---------- //p 주소 : 373930 //&*p 주소 : 373930 //*p 주소 : 1 //&p 주소 : 12ff78 //1 1 //2 2 //3 3 // //fn_noref()--------- //p 주소 : 373930 //&*p 주소 : 373930 //*p 주소 : 0 //&p 주소 : 12ff24 //4 4 //5 5 //6 6 // //main---------- //p 주소 : 373930 //&*p 주소 : 373930 //*p 주소 : 4 //&p 주소 : 12ff78 //4 4 //5 5 //6 6----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변주신분들 넘넘 감사합니다 감사합니다.
답변주신분들 넘넘 감사합니다 감사합니다. ㅠ
#include
#include
void memory(int num, int **pp) {
*pp = (int*) malloc(sizeof(int) * 4);//제가 급하게 올리다 보니 더블포인터 변수인 pp에 * 를넣지 않앗습니다. ㅠ
(*pp)[0] = 1;//qiiiiiip님 말씀대로 괄호를 여기다 주니까 되네요
(*pp)[1] = 2;
(*pp)[2] = 3;
}
int main() {
int num = 8;
int* p = NULL;
memory(num, &p);
printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);
return 0;
}
감사합니다.
답변주신분들 감사합니다.문제를 찾았는데요 ㅠ 제가
답변주신분들 감사합니다.
문제를 찾았는데요 ㅠ 제가 급하게 올리느라 문제가 잘못올려졌네요
#include
#include
void memory(int num, int **pp) {
*pp = (int*) malloc(sizeof(int) * 4);//이부분에서 제가 *를 빼먹엇어서 pp앞에 *값을 넣었습니다.
(*pp)[0] = 1;//qiiiiiiiiiip님 말씀대로 더블 포인터 쪽에 괄호로 감싸니까 컴파일 에러가 없어졌습니다. 컴파일러의 수직 우선순서가 문제였나보내요 ㅠ
(*pp)[1] = 2;
(*pp)[2] = 3;
}
int main() {
int num = 8;
int* p = NULL;
memory(num, &p);
printf("%d\n", p[0]);
printf("%d\n", p[1]);
printf("%d\n", p[2]);
return 0;
}
댓글 달기