파스칼 문자열은 메모리에 어떻게 배치됩니까?파스칼 문자열은 메모리에서 어떻게 표현됩니까?
읽음 : http://www.freepascal.org/docs-html/ref/refsu12.html 문자열은 힙에 저장되고 참조 횟수가 계산됩니다. 길이와 참조가 저장된 위치를 파악하기 위해, 나는 문자열을 만들어 그 위에 많은 테스트를했다 :
이type PInt = ^Integer;
var
str: String;
begin
str := 'hello';
writeln(PInt(@str[1]) - (sizeof(integer) * 1)); //length
writeln(PInt(@str[1]) - (sizeof(integer) * 2)); //reference count
end.
첫 번째는 길이를 출력하고 두 번째는 참조 카운트를 출력합니다. 이것은 완벽하게 훌륭하게 작동하며 작동합니다.
은 지금은 C에서 같은 일을 모방하려 : 다음Export char* NewCString()
{
const char* hello_ptr = "hello";
int length = strlen(hello_ptr);
//allocate space on the heap for: sizeof(refcount) + sizeof(int) + strlength
char* pascal_string = (char*)malloc((sizeof(int) * 2) + length);
*((int*)&pascal_string[0]) = 0; //reference count to 0.
*((int*)&pascal_string[sizeof(int)]) = length; //length of the string.
strcpy(&pascal_string[sizeof(int) * 2], hello_ptr); //copy hello to the pascal string.
return &pascal_string[sizeof(int) * 2]; //return a pointer to the data.
}
Export void FreeCString(char* &ptr)
{
int data_offset = sizeof(int) * 2;
free(ptr - data_offset);
ptr = NULL;
}
파스칼에서 내가 할 :
이var
str: string;
begin
str := string(NewCString());
writeln(PInt(@str[1]) - (sizeof(integer) * 1)); //length - prints 5. correct.
writeln(PInt(@str[1]) - (sizeof(integer) * 2)); //reference count - prints 1! correct.
//FreeCString(str); //works fine if I call this..
end.
파스칼 코드가 제대로 길이를 인쇄하고 참조 카운트가 1 씩 증가 임무 때문에. 이 말이 맞습니다.
그러나 실행이 끝나 자마자 심하게 충돌합니다! 문자열/힙을 해제하려고 시도하는 것 같습니다. FreeCString을 직접 호출하면 잘 작동합니다! 무슨 일이 일어나고 있는지 잘 모르겠습니다.
크래시가 발생하는 이유는 무엇입니까?
여러 버전의 Pascal (Wirth/Turbo Pascal은 바이트 0으로 정의 된 길이, Delphi 2가 도입 한 긴 문자열은 모두 'ShortString'으로 선언하지 않는 한 혼란 스럽습니다.)을 혼란스럽게합니다. 태그에 네 가지 언어가 나열되어 있습니다. 대신, 처음에 실제로 달성하려는 내용을 설명하고 어떻게 수행하는지 질문하는 것이 어떻습니까? 왜 부숴 지느냐하는 것은 당신이 올바르지 않은 것에 대해 잘못된 가정을하고 있기 때문입니다. –
있습니다. 나는 언어를 좁혔다. 매개 변수로 길이를 전달하지 않고도 파스칼 문자열로 C 스타일 문자열을 변환하려고합니다. – Brandon
"c-stype 문자열을 파스칼 문자열로 변환하려고합니다"는 의미는 무엇입니까? Delphi/Free Pascal은 길이 매개 변수없이 null로 끝나는 C 스타일 문자열을 완벽하게 수용 할 수 있습니다. WinAPI 호출을 통해 모든 단일 Windows 응용 프로그램에서 수천 번 수행됩니다. 다시 한번, 당신은 실제로 무엇을 성취하려고합니까? –