var
a : PChar;
i : integer;
begin
a := AllocMem(4*sizeof(Char));
(a + 0*sizeof(Char))^ := 'a';
(a + 1*sizeof(Char))^ := 'b';
(a + 2*sizeof(Char))^ := 'c';
(a + 3*sizeof(Char))^ := 'd';
(a + 4*sizeof(Char))^ := 'e';
(a + 5*Sizeof(Char))^ := 'f';
(a + 6*Sizeof(Char))^ := 'g';
size := 4;
ShowMessage(a);
Result := a;
end;
결과는 'abcdefg'입니다. a에 할당된 메모리는 위에서와같이 4개의 문자가
들어갈 만큼인데 마구마구 문자를 넣어도 멀정하네요? 이런경우 컴파일은
되어도 런타임 에러가 나야할 것같은데 말입니다. 할당된 메모리 영역을
벗어났는데 이럴 수가 있나요? 주소값을 할당한 메모리 영역 밖으로 지정하는건
가능할지 몰라도 그곳에 문자형 값을 넣는다는건.... 혹시 델파이가 똑똑해서
메모리 할당 이후에 추가적으로 엑세스하는 부분에대해서도 메모리를 추가
해주는 기능을 하나요? 그런 식으로라도 위의 것이 신뢰할 수 있는 결과라면
잘된거고....
> 혹시 델파이가 똑똑해서
> 메모리 할당 이후에 추가적으로 엑세스하는 부분에대해서도 메모리를 추가
> 해주는 기능을 하나요? 그런 식으로라도 위의 것이 신뢰할 수 있는 결과라면
> 잘된거고....
>
도움말을 보시면 알겠지만..
AllocMem함수는 지정한 크기만큼의 heap영역에 버퍼를 할당하고
NULL로 초기화 시켜주는 함수입니다.
그런데 잡아준 영역보다 데이터의 길이가 넘어갔을 때
그영역(efg가 들어간 곳)에 중요한 데이터가 있어서 덮어 쓸 경우에는
당연히 문제가 생기겠지요.
그렇지 않은 경우에는 위와 같이 제대로 나오겠지요.
결코 델파이가 똑똑해서 그런건 아닙니다.
C도 마찬가지니까요..
그렇게 희한하지는 않군요.그럼 즐거운 코딩하세요^^