|
char string[20];
strcpy(string, Edit1->Text.c_str);
이 문장은 문자열을 다른 메모리 공간에 복사하는 의미가 됩니다.
즉 같은 문장이 2군데의 메모리에 저장되는 것을 의미합니다. 기존의 Edit1->Text 라는 별도의 버퍼와 string[20] 이라는 두개의 별도의 메모리 영역을 가지게 됩니다.
char* string = Edit1->Text.c_str();
이 문장은 한개의 메모리 공간을 가지며 대신 그 메모리의 포인터(메모리 주소번지)만 string에 저장되는 것입니다.
첫번째 문장에서 string의 내용을 변경해도 Edit1->Text 의 내용은 변경이 되지 않겠지만, 두번째 문장의 경우 string의
내용을 바꾸면 Edit1->Text의 내용도 변경됩니다. 같은 공간에 내용을 공유하고 있기 때문이죠...
(수정) 그런데 지금 막 테스트 해 보니 두번째 문장에서 string을 변경해도 Edit1->Text 의 내용은 변경이 되지 않네요..
이유를 보니까 string의 내용을 변경하면 Edit1->Text 의 메모리 주소가 변경되면서 기존에 있던 문자를 그냥 가지고 갑니다.
임형섭 님이 쓰신 글 :
: 아래 소스와 같이 edit에서 글을 입력해서 strtok를 이용해 문자열을 구분하여 출력하는겁니다.
: 의문이 나는것은 주석처리 한부분입니다.
: 1,2를 한 줄에 쓰면 3과 같다고 생각했습니다. 그런데 결과는 동일하지 않네요
: 그 이유를 모르겠습니다.
: 간단히 char string[20];
: strcpy(string, Edit1->Text.t_str;
: 과
: char* string = Edit1->Text.t_str();
: 의 차이점을 모르겠습니다.
: 질문도 제대로 못하는 초보였습니다.
:
: 다시 살펴보니 전에 질문했던 내용과 같은 내용인것 같아서
: Edit2->Text.t_str(); 이함수에서 읽은 내용이 지역변수(?)가 되기 때문에 값이 유지가 안되어서 그런걸까요?
: 만약 그렇다면 strcpy에서도 올바른 값이 나오지 않아야 하는것 아닌가요?
:
:
: void __fastcall TForm4::Button1Click(TObject *Sender)
: {
: char string[20];<------------------------1
: strcpy(string, Edit1->Text.t_str());<---------2
: //char* string = Edit1->Text.t_str();<--------3
:
: char token[10];
: strcpy(token, Edit2->Text.t_str());
: char* temp;
: // char* token = Edit2->Text.t_str();
: temp = strtok(string, token);
: Memo1->Lines->Add(temp);
: while(temp != NULL)
: {
:
: temp = strtok(NULL, token);
: Memo1->Lines->Add(temp);
: }
: }
|