전역 포인터 변수의 값 변화 현상..
글쓴이: NeoCode24 / 작성시간: 화, 2005/07/05 - 2:08오후
테스트용 소스 입니다.
2차원 포인터는 원래 함수에 넘겨서 malloc()를 일정 FACTOR만큼 꾸준히 증가하는 부분입니다.
임시로 땜방용으로 만든거라.. 괜히 2차원 포인터를 사용한것
같지만.. 우선 밑에 결과에 의아심을 함 보아주세요.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #define SUCCESS 0 #define ERROR -1 #define IPADDRESS_LEN 50 #define IFNAME_LEN 50 #define INTERFACE_MAX_COUNT 100 #define GROUP_MAX_COUNT 3 typedef struct ForwardingTreeIfOutInfo { char szOutIfName[IFNAME_LEN]; int nOutIfIndex; } ForwardingTreeIfOutInfo_t; typedef struct ForwardingTreeGroupOutInfo { char szGroupAddress[IPADDRESS_LEN]; char szSourceAddress[IPADDRESS_LEN]; char szSourceMaskAddress[IPADDRESS_LEN]; char szUpstreamNeighbor[IPADDRESS_LEN]; char szRPAddress[IPADDRESS_LEN]; char szInIfName[IFNAME_LEN]; int nInIfIndex; int nOutIfCnt; ForwardingTreeIfOutInfo_t stOutIf[INTERFACE_MAX_COUNT]; } ForwardingTreeGroupOutInfo_t; ForwardingTreeGroupOutInfo_t *g_pstGroupStructArray; int main (int argc, char *argv[]) { ForwardingTreeGroupOutInfo_t stForwardingTreeGroupOutInfo[GROUP_MAX_COUNT]; ForwardingTreeGroupOutInfo_t **pstForwardingTreeGroupOutInfo, *ptrTemp; g_pstGroupStructArray = stForwardingTreeGroupOutInfo; pstForwardingTreeGroupOutInfo = &g_pstGroupStructArray; ptrTemp = (ForwardingTreeGroupOutInfo_t *)malloc(sizeof(ForwardingTreeGroupOutInfo_t) * GROUP_MAX_COUNT * 2); *pstForwardingTreeGroupOutInfo = ptrTemp; return SUCCESS; }
함수 의 리턴 앞줄에
" *pstForwardingTreeGroupOutInfo = ptrTemp; "
보면 전역변수는 절대 손대지 않았습니다.
새로 malloc()한 ptrTemp만 2차원포인터의 값으로 넣었습니다.
그렇게 되면 전역변수는 바뀌지 말아야 하는데..
이상하게 전역변수 조차도 바껴집니다..
제가 포인터를 잘못사용하고 있는건지..
전역포인터 변수에 값을 넣을때 주의 해야 할점이 있는건지..
충고좀 부탁드립니다.
소스의 목적은..
배열을 사용하다가 그 크기를 초과하게 되면 일정 배율로 동적할당하는 방법입니다.
때문에 후에 사용되는 변수가 동적 할당 된놈인지.. 배열인지 알수가 없기에 전역변수에 배열의 주소를 저장 시켜뒀습니다.
free() 함수를 사용할때 if문으로
if ( 배열의 주소 != *(2차원 포인터) )
이렇게 하여 다르다면 malloc() 했다고 판단하였기 때문입니다.
그런데 원하지 않게 배열의 주소가 담겨 있는 전역변수의 값도
같이 바껴 버립니다.. ㅡㅡ;;
고수님들의 날카로운 지적 부탁드립니다~
Forums:
[code:1]// ForwardingTreeGroupOutInfo_
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
전역 포인터가 바뀌는 이유는 fehead님이 설명해 주셨고요, 다른 문제
전역 포인터가 바뀌는 이유는 fehead님이 설명해 주셨고요, 다른 문제도 있습니다.
배열로 만든 것보다 더 많은 메모리가 필요해지면 malloc()을 한다고 하셨는데
그럼 malloc() 후에 배열의 메모리는 쓸모없이 낭비됩니다. 처음부터 malloc()을
하는 것이 좋아 보입니다. 참고하세요.
http://bbs.kldp.org/viewtopic.php?p=275794&highlight=#275794
변수명이 너무김..ㅡ,.ㅡ;;
변수명이 너무김..ㅡ,.ㅡ;;
----------------------------------------------------------------------------
댓글 달기