인자로 받은 포인터를 malloc 하려는데...
글쓴이: harion01 / 작성시간: 금, 2011/07/29 - 4:50오후
#include
#include
#include
typedef struct ListNode{
char data;
struct ListNode *link;
}NODE;
int makeNodeE(NODE *a_node);
int main(){
NODE *head;
//head = malloc(1);
makeNodeE(head);
}
int makeNodeE(NODE *a_node){
a_node = (NODE *)malloc(sizeof(NODE));
return 0;
}
위의 코드에서 주석부분이 없으면 인자값을 malloc 하지 못하고, 사이즈가 다르던지, 같던지 상관없이 malloc 을 통해 공간을 할당 받으면 인자값도 다시 malloc 이 되는걸 알았습니다.
그런데 정확히 내부에서 어떤 이유때문에 공간이 할당 안된 인자값에 malloc 을 못하는지 모르겟네요.
왜 같은 코드인데 main 함수안에서
int main(){
NODE *head;
a_node = (NODE *)malloc(sizeof(NODE));
}
식으로 사용할 경우에는 메모리에 공간이 잡히면서, 인자로 받을 경우에는 공간 할당을 못하는건가요?
아니면 malloc 은 문제가 없지만, 함수를 왔다갔다 하는 과정에서 문제가 발생하는건가요?
Forums:
int makeNodeE(NODE
int makeNodeE(NODE **a_node){
*a_node = (NODE *)malloc(sizeof(NODE));
return 0;
}
이렇게 하세요.
어떻게 쓰는지가 궁금한게 아닌데요...
malloc 으로 공간 할당하는거야 함수로 안되면 그냥 main 안에 써서 구현해도 되고, 정안되면 return 값으로 공간 할당된걸 받아서 써도 됩니다.
궁금한건 왜 함수안에서 인자값의 메모리할당이 안되냐는 거였는데...
이중포인터를 쓰면 뭐가 다른가요?
게다가, 실제로 답변주신 코드를 써보면 세그멘테이션 오류가 나는데 제가 잘못적용시킨건가요?
int makeNodeDouble(NODE **a_node);
int main(){
NODE **head;
// head = malloc(1);
makeNodeDouble(head);
printf("node create! \n");
}
int makeNodeDouble(NODE **a_node){
*a_node = (NODE *)malloc(sizeof(NODE));
return 0;
}
맨 밑의 node create 를 출력 못하고 세그멘테이션 오류가 나네요.
마찬가지로, 주석 부분을 해제하면 세그멘테이션 오류는 나지 않고 공간 할당이 잘됩니다.
NODE
NODE *head;
makeNodeDouble(&head);
이렇게 하셔야죠.
int foo( int *a );
a 는 지역변수입니다.
지역변수에다 값을 할당하고 함수가 종료되면. 할당했던 값을 날라가요.
오류가 나는 원인은 pointer에 대한 문제입니다.
포인터는 주소를 가질수 있는 변수입니다.
NODE *head;
선언시 쓰레기값을 가지고 있습니다.
착각하기 쉬운문제인데, 선언된 *head는 어떠한 주소도 가지고 있지않습니다.
아마도 질문을 하신 분께서는 head의 주소값을 넘겼는데 왜 안되나???왜 오류가 날까???
난 제대로 주소를 넘겨줬는데 라는 착각을 하신걸꺼라 추측됩니다.
질문자께서는 주소를 넘겨준게 아니고 쓰레기값을 넘겨준것입니다.
makeNodeE(head); 잘못준거죠.. 주소
makeNodeE(head);
잘못준거죠..
주소를 넘긴게 아니라 값을넘긴거죠.. 주석부분에서 값을 할당하지 않았으니 쓰레기 값이고.. 이것에는 다른값을 할당할수가 없습니다.
makeNodeE(&head);
로 주셔야 원하는게 되겠죠.
만약 c++라면 pointer의 레퍼런스를 쓸수도 있습니다.
Life rushes on, we are distracted
이건 결국 call by value와 call by
이건 결국 call by value와 call by reference 의 차이를 물어보시는 것과 같은 이치입니다.
댓글 달기