[완료] 0으로 초기화한 구조체를 if에 넣으면 참일까요...(추가 질문좀 해도 될까요??)
글쓴이: 고양이를부탁해 / 작성시간: 목, 2008/05/29 - 9:39오후
struct NODE{ int bRoot; int nElm[DEGREE-1]; void* pChild[DEGREE]; }; struct NODE* pNode; pNode = (struct NODE*)malloc(sizeof(struct NODE)); memset(pNode, 0, sizeof(struct NODE));
위에처럼 동적할당을 하고선 memset으로 메모리의 내용을 전부 0으로 초기화를 했습니다.
그리고 나서
if(pNode)라는 조건문을 사용한다면
이 조건은 참이 되나요 거짓이 되나요??
pNode가 거짓이 되려면 어떤 값을 가져야 할까요??
좋은 의견 감사합니다 ^^
----------------------------------------------------------------------------
추가 질문좀 해도 될까요?? 이해가 되었다고 생각했는데 소스분석을 하다보니 다시 막히네요.
위 코드에 덧붙여 다음과 같은 코드가 있습니다.
struct *NODE pChild;
pChild = (struct NODE *)pCurr->pChild[0];
if(pChild)에서 조건이 거짓이 아닐까요?? 도움 부탁드리겠습니다
Forums:
위 코드에서 if(pNode)
위 코드에서 if(pNode) 를 하시면 당연히 참이 됩니다.
pNode는 포인터이기 때문에 0이 아닌 특정 주소의 값을 가지고 있을 겁니다.
그러니 참일수 밖에 없지요.
if(pNode) 가 false 이려면..
pNode = NULL; (NULL은 보통 (void *)0 으로 정의됩니다.)
이어야 하겠지요.
memset등으로 메모리를 할당을 한다면 메모리 할당이 실패하지 않는 이상은 어떤 값으로 채워넣어도 true일 수 밖에 없습니다.
ps. 만약 의도하신것이 if(*pNode) 라면.. 이건 C문법에 위배가 됩니다.
--
Emerging the World!
Emerging the World!
정말 감사합니다!!
감사합니다 한가지 더 질문해도 될까요?
pNode가 false이려면 NULL을 pNode에 넣으면 된다고 하셨는데
memset에서 NULL로 초기화할 수도 있을까요??
------------
힘들면 즐겁다.
------------
힘들면 즐겁다.
잘못 이해하고 계신
잘못 이해하고 계신 듯 합니다.
malloc 이 성공한 이후부터는 free를 하거나 pNode=NULL; 등으로 강제로 주소를 바꾸지 않는 이상은 절대 false가 나지 않습니다.
(정확히 하자면 free를 해도 true가 나올 가능성이 큽니다.)
if(pNode) 라는 코드는 pNode가 메모리 할당이 되었느냐 안되었느냐를 알아보는 코드이지..
pNode가 가리키고 있는 값이 어떠냐하고는 전혀 무관합니다.
memset이 가능하다는 말은 이미 메모리 할당이 되어있다는 말이므로 memset으로 아무리 삽질을 해도 false가 나오게 할순 없습니다.
PS. 위의 답변 중에 "memset등으로 메모리를 할당을 한다면" 이라고 썼는데.. 메모리를 할당하는 건 "malloc"이죠;;
실수 했네요.
--
Emerging the World!
Emerging the World!
참고로 void free ( void *
참고로
void free ( void * ptr );
이기 때문에 free 후에도 주소가 남아있습니다.
그래서 깜빡하고 free 후에 참조를 하는 일이 발생해버리죠 -_-;
저도 그게 확실치
저도 그게 확실치 않아서 true일 가능성이 크다고 썼습니다. :)
확인해보니 free를 하더라도 NULL을 넣어버린다던가 하진 않더군요.
그런데 왜 그렇게 구현이 되어있을까요?
free시 NULL로 초기화하면 깜빡하고 free후에 참조하는 일 같은 건 없을텐데요..
--
Emerging the World!
Emerging the World!
Call-by-value니까 free
Call-by-value니까 free 함수에서 NULL로 초기화하는 게 불가능하죠.
그걸 call-by-reference로 하려면 포인터의 포인터를 넘겨야 하는데 아무래도 불편하기도 하고 overhead도 생기죠.
argument type을
argument type을 보면(그리고 free의 역할로는...),
free()가 NULL 넣을 방법이 없을 것 같은데요?
(추가:답글 다는 사이 jick님이 먼저 올리셨네요,
지우려니까 댓글은 지울 수 없나 보네요 -_-)
우문현답이네요 ^^
제가 질문을 잘못했네요
덕분에 힌트 많이 얻고 갑니다!!
항상 행복하시길 ^^
------------
힘들면 즐겁다.
------------
힘들면 즐겁다.
댓글 달기