Q&A

  • 메모리 할당에 관련된 질문입니당.
특정변수를 포인터로 잡아넣고 함수에 전달하여 원하는 만큼 메모리를 할당한 후 0으로 채우기 위해서 아래와 같이 구현해 봤어요. 그런데 잘 안되네요..

뭐가 잘못되었는지 가르켜주시면 고맙겠습니다.



초보예요. 메모리 관련부분을 좀 알려주세요

type UINT4 = Cardinal;

type pUINT4 = ^UINT4;

//////////////////////////

procedure AssignOh(var C : pUINT4; digits: integer);

begin

getmem(c, digits);

fillchar(C^, sizeof(c), 0); //변수를 0으로 채우기 위해서

end;

//함수는 위와 같이 잡았어요.////////////////////



procedure TForm1.Button1Click(Sender: TObject);

var

digits, m, n : integer;

c : pUINT4;

begin

AssignOh(c, 5); //위함수 첫번째 파라메터는 인티지형 포인터구요, 두번째 파라메터

는 5섯자리를 메모리에 할당하기 위해서에요.

memo1.Lines.Add(inttostr(c^)); //아래 코드는 테스트 해보기 위해서

inc(c,1); //이렇게 하면 주소가 하나 증가되지 않나요?

memo1.Lines.Add(inttostr(c^));

end;



1  COMMENTS
  • Profile
    최용일 2000.03.08 01:04
    AssignOh함수를 고쳐야 겠는데요...

    begin

    GetMem(c, Digits * SizeOf(C));

    FillChar(C^, Digits * SizeOf(C), 0);

    end;

    Inc를 써서 포인터를 증가시키는 것은 맞습니다. 즉 다음 Cardinal값의 번지가

    됩니다.(즉 4바이트증가된 번지);

    하지만 Free할 땐 증가되기 전의 메모리 번지를 프리해야합니다..

    GetMem으로 포인터를 얻었으면 반드시 사용후 FreeMem으로 해제하는것을 잊으면

    않됩니다..

    이전의 함수로 AssignOh(c, 5); 이렇게 호출하면 다섯개의 Cardinal(하나당 4바이트)을

    할당받는 것이 아니라 단지 5바이트만 할당되죠..