특정변수를 포인터로 잡아넣고 함수에 전달하여 원하는 만큼 메모리를 할당한 후 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;
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바이트만 할당되죠..