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
[66801] Re:Re:Re:Re:Re:memcpy의 궁금점
장성호 [nasilso] 1260 읽음    2012-04-02 18:38
사용하시는 개발툴이 RAD2009이상의 최신버젼인가 보네요

유니코드 기반인듯 합니다.

[유니코드 문자열 메모리 복사]
유니코드이면 문자 하나에 길이가 1Byte가 아닐수 있습니다.

String의 Length는 문자 갯수가 나올뿐이니, 실제 몇Byte를 가르치지는 않습니다.

AnsiString일때는 Length와 메모리크기와 똑같구요

다음과 같이 복사하시면 될듯합니다.

   String sText=Memo1->Lines->Text;      
   TEncoding* Encoding= TEncoding::Default;
   TBytes Buffer=Encoding->GetBytes(sText);
   memcpy(a.aText ,&Buffer[0],Buffer.Length);



기타 주의 사항

주의1 .
Memo1->Lines->Text 는 Property입니다.
Memo1->Lines->Text.c_str() 하면
원래 있던 메모리 주소를 return하는것이 아니라
새로 String을 할당해서 메모리를 return합니다.


memcpy(a.aText, Memo1->Text.c_str(), Memo1->Text.Length() * sizeof(Memo1->Text[1]);

위와 같은 코드를 쓰시면
Text에 3회 접근하기 때문에
세번이나 String메모리 할당 해제가 됩니다.
그리고 세번의 Text의 주소가 모두 다르구요

그러니
위에 제 코드처럼
String변수에 받아서 쓰는것이 바람직합니다.

주의2.
  Memo1->Lines->Text 의 길이(메모리 크기가 ) 100Byte넘어가면
  어떻게 되죠?
  이부분은 memcpy하기 전에
  크기 체크를 해야할듯 하네요


그럼..

축구 님이 쓰신 글 :
: 음 텍스트 1번째 크기를 곱해주니 잘찍히네요. 왜곱해주는지는 생각좀 해봐야 할것 같군요.
:
: 감사합니다.
:
:
: Lyn 님이 쓰신 글 :
: : memcpy(a.aText, Memo1->Text.c_str(), Memo1->Text.Length() * sizeof(Memo1->Text[1]);
: : 축구 님이 쓰신 글 :
: : : 으흠 해봤는데 그대로 글이 뒤에가 짤려서 복사가 되네요 ㅠㅠ
: : : 메모장 내용이 문제가 있는건가요 메모장에
: : : /*
: : : 이건 테스트용 입니다.
: : :
: : : ...........................vasdv..........
: : : */
: : :
: : : 이렇게 되있거든요.
: : :
: : : 근데 출력은
: : : /*
: : : 이건 테스트용입니다.
: : :
: : : ......................//...vasdv.........
: : :                       //표시 뒤는 짤리는 부분
: : : */
: : :
: : : 여기까지 밖에 안되요 혹시 .............에 문제가 있는건가요?
: : :
: : :
: : :
: : : 김태선 님이 쓰신 글 :
: : : : memcpy(a.aText, Memo1->Text.c_str(), Memo1->Text.Length());
: : : :
: : : : 축구 님이 쓰신 글 :
: : : : : struct aaa
: : : : : {
: : : : :    char aText[100];
: : : : :   
: : : : :    aaa()
: : : : :    {
: : : : :       memset(this, 0, sizeof(aaa));
: : : : :    }
: : : : : };
: : : : :
: : : : : 이렇게 구조체를 만들고
: : : : : aaa a;
: : : : :
: : : : : memcpy(&a.aText, Memo1->Text.c_str(), Memo1->Text.Length());
: : : : :
: : : : : 이렇게 복사해서 출력을 하니까 뒤 몇글자를 짤라먹더라고요.
: : : : :
: : : : : 브레이크 포인트 찍어서 봤는데 Memo1->Text에 값은 잘들어가있고 복사된 a.aText 를 보니까 한글은 깨져서 받고 나머지 뒷부분은 다 못받아 온걸 확인했습니다.
: : : : : 한글이 깨져서 받아졌는데 출력은 정상으로 됐고요 못받아온 뒷부분은 출력이 짤리더라고요
: : : : : 뭔가 틀린게 있나요? 복사는 되는데 전부 복사하질 않네요

+ -

관련 글 리스트
66775 memcpy의 궁금점 축구 915 2012/03/30
66776     Re:memcpy의 궁금점 김태선 987 2012/03/30
66796         Re:Re:memcpy의 궁금점 축구 889 2012/04/02
66798             Re:Re:Re:memcpy의 궁금점 Lyn 917 2012/04/02
66799                 Re:Re:Re:Re:memcpy의 궁금점 축구 879 2012/04/02
66801                     Re:Re:Re:Re:Re:memcpy의 궁금점 장성호 1260 2012/04/02
66803                         Re:Re:Re:Re:Re:Re:memcpy의 궁금점 축구 1098 2012/04/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.