종이에 그림그리면서 설명해야 되는데...
[소스]
: change= (char **)malloc(sizeof(char*)*(stri+1));
: change[stri]= (char *)malloc(strlen(p)+1);
: sprintf(change[stri],"%s",p);
[설명]
1. change
change 는 char ** 이죠?
그럼 위코딩엔 없지만 어딘가에 char **change 이렇게 선언되어있을것이구
이는 win32에서 기본적으로 모든 포인트는 4Byte이므로
change에 4Byte가 할당되어있겠죠
2. change= (char **)malloc(sizeof(char*)*(stri+1));
; 메모리를 새로 할당해서 그 주소를 change에 저장하는 코드
sizeof(char *) // ==> 4Byte 이구
위코드에서 stri = 5 라고 가정합시다.
그럼 (stri+1) * 4 = (5+1) *4 = 24 Byte
malloc(sizeof(char*)*(stri+1)); //24Byte를 새로 할당해서..
change= (char **)malloc(sizeof(char*)*(stri+1)); //change 에다가 주소를 저장합니다.
3. change[stri]= (char *)malloc(strlen(p)+1);
p의 string길이 + 1 만큼 새로 메모리를 할당해서 char * 인 change[] 에 첫번째 주소를 저장
p="abcdefg" 라고 가정합시다.
strlen(p) 는 7 이구 7+1 인 8Byte를 새로 할당해서
2과정에서 생성한 24Byte중에 change[stri] = change[5]에 주소를 저장하네요 ( 21~ 24)
change[stri]= (char *)malloc(strlen(p)+1);
change 가 char ** 이므로 change[] 은 char *입니다.
string길이보다 1Byte더 잡는 이유는 string은 그 끝을 0x00을 파악하기때문에.. 그렇습니다.
4. sprintf(change[stri],"%s",p);
; p에 있는 문자열을 change[stri]이 가르키는 메모리에 복사
3과정에서 생성한 8Byte 위치에 p의 내용을 복사하네요
정리하면..
2과정은 char * 변수를 stri+1개 만들어서
그 첫번째 메모리의 주소를 char** 인 change에 저장해 두는것입니다.
아래 링크에 포인터-포인터를 써서 TLabel을 동적으로 생성한 샘플이 있습니다.
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=50641
참고하세요
그럼..
redtomato 님이 쓰신 글 :
: 입력받은 값을 p = strtok(search," "); 로 끊어서 각각의 배열에 저장하는 과정입니다.
:
: 흐름은 알겠는데, 할당과정에 더블포인터의 실제 역할과 세부 사항들이 알고 싶습니다.
:
: 내부에서는 어떻게 메모리가 다루어 지는지...
:
:
: change= (char **)malloc(sizeof(char*)*(stri+1));
:
: change[stri]= (char *)malloc(strlen(p)+1);
:
: sprintf(change[stri],"%s",p);
댓글 없음:
댓글 쓰기