C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[51014] Re:메모리 할당좀 설명해 주세요~~
장성호 [nasilso] 1058 읽음    2007-10-24 09:29
종이에 그림그리면서 설명해야 되는데...

[소스]
:               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);

+ -

관련 글 리스트
50958 메모리 할당좀 설명해 주세요~~ redtomato 1138 2007/10/20
51014     Re:메모리 할당좀 설명해 주세요~~ 장성호 1058 2007/10/24
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.