Q&A

  • PChar에 대하여..
var
  Buff     : string;
  nSize  : integer;
  P1, P2 : Pchar;
  AList   : TList;
begin
  Buff := '1234567890';
  nSize := length(Buff);
  
  GetMem(Mem1, nSize + sizeof(LongInt)); // 메모리 할당한다.
  P1 := P2;  <------------------1번
  
  Move(nSize,P1^,Sizeof(LongInt));  // 문자열의 길이를 설정한다
  
  inc(P1, Sizeof(Longint));          // Sizeof(Longint)만큼 포인터를 옮긴다.
  
  Move(Buff[1],P1^,nSize);   // Buff의 내용을 P1에 Move.

  AList.add(P2);<-----------------2번

위에 소스에서 제가아는데로 주석을 달았는데
제가 이해하고 있는것이 맞나 알려주세요..
그리고
1번에서 P1과 P2는 무엇이 같다는거요?
주소값이 같다는건가요 아님 같은 값을 가진다는 건가요?
2번에서 P2를 리스트에 add할때 P2에는 어떤값이 들어가는거요?
그리고 마지막으로
P1에는 어떤값이 들어가는거요?
buff의 내을을 포인터로 가르치는건가요 아님 buff의 내용을 복사해오는건가요?

답변기다리겠습니다.

3  COMMENTS
  • Profile
    최용일 2003.03.14 02:44
    안녕하세요. 최용일입니다.

    처음 코드에서 Mem1이 아니라 P2가 되어야 제대로된 코드가 될거 같네요...
    GetMem(P2, nSize + sizeof(LongInt));

    1번은 P1과 P2가 같은 메모리 번지를 참조하라는 소리네요... P2를 가지고 직접 포인터 연산하면 맨나중에 리스트에 넣을때 GetMem으로 얻은 번지에서 4바이트더해진 번지가 저장되기 때문에 P1을 가지고 포인터 연산을 해서 해당 값을 넣고 마지막에 P2를 저장하는 겁니다.

    2번에서는 GetMem으로 생성한 메모리 번지가 들어가겠죠...

    P2에 있는 값은 처음 4바이트에는 문자열크기가 들어가고 그다음에 그 크기만큼의 문자열이 들어가겠네요...

    P1에는 포인터 연산해서 4바이트 증가해주었기때문에 문자열만 들어가겠죠...

    P2                         |P1
    4바이트(문자열크기)|'1234567890'

    ^^ 항상 즐코하세요...

  • Profile
    포 맷 2003.03.14 05:31
    답변에 감사 드립니다.
    그런데여 2번 대신에
      
    Dec(P1, Sizeof(Longint));          
    AList.add(P1);
    이렇게 하면

    AList.add(P2);
    한것과 같은 결과란 말인가요?
    아님 차이점이 있나요?



  • Profile
    최용일 2003.03.14 07:06
    안녕하세요. 최용일입니다.

    4바이트 빼주면 둘 다 똑같은 메모리위치를 가리치게 되므로 차이점이 없습니다.

    ^^ 항상 즐코하세요...