Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «О Ρ‡Ρ‘ΠΌ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚ Π² ΠΊΠ½ΠΈΠ³Π°Ρ… ΠΏΠΎ DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 102

Автор А. Π“Ρ€ΠΈΠ³ΠΎΡ€ΡŒΠ΅Π²

 P := PChar(S);

 P[0] := 'T'; { * }

 Label1.Caption := P;

end;


procedure TForm1.Button3Click(Sender: TObject);

var

 S: string;

begin

 S := 'Xest';

 S[1] := 'T';

 Label1.Caption := S;

end;


procedure TForm1.Button4Click(Sender: TObject);

var

 S: ShortString;

begin

 S := 'Xest';

 S[1] := 'T';

 Label1.Caption := S;

end;


procedure TForm1.Button5Click(Sender: TObject);

var

 S: ShortString;

 P: PChar;

begin

 S := 'Xest';

 P := @S[1];

 P[0] := 'T';

 Label1.Caption := P;

end; 

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию надписи Test. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Access violation Π² строках, ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Ρ… Π·Π²Π΅Π·Π΄ΠΎΡ‡ΠΊΠ°ΠΌΠΈ, Π° ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ пятой ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ (хотя Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΎΠ½ΠΎ всС ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ), Π½ΠΎ ΠΊ слову "Test" добавляСтся ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ мусор. РазбСрСмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊ происходит.

ВстрСтив Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π» 'Xest' ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ², Ρ‡Ρ‚ΠΎ ΠΎΠ½ относится ΠΊ Ρ‚ΠΈΠΏΡƒ PChar, компилятор выдСляСт Π² подходящСй области сСгмСнта ΠΊΠΎΠ΄Π° ΠΏΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² (Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π·Π½Π°Ρ‡Π°Ρ‰ΠΈΡ… символа ΠΈ ΠΎΠ΄ΠΈΠ½ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ ноль), Π° Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ P заносится адрСс этого Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π°. Π‘Π΅Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния, ΠΏΡ€Π°Π² Π½Π° Π΅Π³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ систСма ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² цСлях бСзопасности Π½Π΅ Π΄Π°Π΅Ρ‚, поэтому ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ находится Π² этом сСгмСнтС, ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠΌΡƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ β€” Π²Ρ‹Π΄Π°Ρ‡Π΅ сообщСния "Access violation".

Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ происходит ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚ΠΎ ΠΆΠ΅ самоС, с Ρ‚ΠΎΠΉ лишь Ρ€Π°Π·Π½ΠΈΡ†Π΅ΠΉ. Ρ‡Ρ‚ΠΎ для Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° выдСляСтся Π½Π° восСмь Π±Π°ΠΉΡ‚ΠΎΠ² большС: Ρ‚.ΠΊ. Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ AnsiString, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½Ρ‹ Π΅Ρ‰Π΅ 4 Π±Π°ΠΉΡ‚Π° для хранСния Π΄Π»ΠΈΠ½Ρ‹ ΠΈ 4 β€” для счСтчика ссылок. Π’ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ S записываСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот Π»ΠΈΡ‚Π΅Ρ€Π°Π». ΠŸΡ€ΠΈΠ²ΠΎΠ΄Ρ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΊ Ρ‚ΠΈΠΏΡƒ PChar, ΠΌΡ‹, ΠΏΠΎ сути, просто ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌ этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ P, Π° дальшС происходит Ρ‚ΠΎ ΠΆΠ΅ самоС β€” ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ страницу памяти, Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния с Ρ‚Π΅ΠΌ ΠΆΠ΅ самым Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ.

Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ случаС Π»ΠΈΡ‚Π΅Ρ€Π°Π», ΠΊΠ°ΠΊ ΠΈ Ρ€Π°Π½ΡŒΡˆΠ΅, размСщаСтся Π² сСгмСнтС ΠΊΠΎΠ΄Π°. Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ ссылок Ρƒ Ρ‚Π°ΠΊΠΈΡ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² всСгда Ρ€Π°Π²Π΅Π½ -1 β€” это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρƒ памяти, Ρ‡Ρ‚ΠΎ это константа, которая Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΡ€ΠΈ любой ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ присвоСн Π»ΠΈΡ‚Π΅Ρ€Π°Π», срабатываСт ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ копирования ΠΏΠΎ нСобходимости: для строки выдСляСтся мСсто Π² динамичСской памяти, Π·Π°Ρ‚Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° копируСтся Π² эту ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, обновляСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля S, Π° Π·Π°Ρ‚Π΅ΠΌ выполняСтся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ, находящСйся Π² динамичСской памяти. Π’Π°ΠΊ ΠΊΠ°ΠΊ эта ΠΏΠ°ΠΌΡΡ‚ΡŒ доступна ΠΈ для чтСния, ΠΈ для записи, ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, ΠΈ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΈ Π±Ρ‹Π»ΠΎ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ.

Π’ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠΌ случаС Π»ΠΈΡ‚Π΅Ρ€Π°Π» Ρ‚Π°ΠΊΠΆΠ΅ хранится Π² сСгмСнтС ΠΊΠΎΠ΄Π°, Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ ΡƒΠΆΠ΅ Π½Π΅Ρ‚. Π­Ρ‚ΠΎΡ‚ Π»ΠΈΡ‚Π΅Ρ€Π°Π» Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π°ΠΌ ΠΏΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ²: ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚ Π½Π° Π΄Π»ΠΈΠ½Ρƒ ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ β€” Π½Π° символы. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ S Ρ€Π°Π·ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ΡΡ Π² стСкС, занимая Ρ‚Π°ΠΌ 256 Π±Π°ΠΉΡ‚ΠΎΠ², Π° присваиваниС Π΅ΠΉ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° β€” это ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ значСния Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΈΠ· сСгмСнта ΠΊΠΎΠ΄Π° Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти, Π·Π°Π½ΡΡ‚ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² дальнСйшСм ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π΅ с константой Π² сСгмСнтС ΠΊΠΎΠ΄Π°, Π° с Π΅Π΅ ΠΊΠΎΠΏΠΈΠ΅ΠΉ Π² стСкС, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Π’ пятом случаС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° этот участок стСка. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚: для записи Π² P адрСса ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа строки приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ получСния адрСса @. ΠœΠΎΠ΄ΠΈΡ„икация строки ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚, ΠΊΠ°ΠΊ ΠΈ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ случаС, ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ, Π½ΠΎ ΠΏΡ€ΠΈ присваивании выраТСния Ρ‚ΠΈΠΏΠ° PChar свойству Ρ‚ΠΈΠΏΠ° AnsiString Π΄Π»ΠΈΠ½Π° строки опрСдСляСтся ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ, принятым для PChar, Ρ‚.Π΅. строка сканируСтся Π΄ΠΎ обнаруТСния Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ShortString "Π½Π΅ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚" Π·Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… символах, Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡΡ‚Π°Ρ‚ΡŒΡΡ всякий мусор ΠΎΡ‚ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ использования стСка. Никакой Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ, Ρ‡Ρ‚ΠΎ сразу послС послСднСго символа Π±ΡƒΠ΄Π΅Ρ‚ #0, Π½Π΅Ρ‚. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ появлСниС нСпонятных символов Π½Π° экранС.

ΠžΠ±Ρ‰ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°ΠΊΠΎΠ²: ΠΏΠΎΠΊΠ° ΠΌΡ‹ Π½Π΅ вмСшиваСмся Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ компилятора с Ρ‚ΠΈΠΏΠ°ΠΌΠΈ ShortString ΠΈ AnsiString, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π Π°Π±ΠΎΡ‚Π° с этими ΠΆΠ΅ строками Ρ‡Π΅Ρ€Π΅Π· PChar Π² ΠΎΠ±Ρ…ΠΎΠ΄ стандартных ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ появлСнию ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со строками PChar Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ, Π³Π΄Π΅ ΠΈ ΠΊΠ°ΠΊ выдСляСтся для Π½ΠΈΡ… ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΠ½Π°Ρ‡Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

3.3.3. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² ΠΊ Ρ‚ΠΈΠΏΡƒ PChar

Π’ Ρ€Π°Π·Π΄. 1.1.13 ΠΌΡ‹ ΡƒΠΆΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° PChar, ΠΈ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ строковый Π»ΠΈΡ‚Π΅Ρ€Π°Π» (см. листинг 1.20). ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π»ΠΈΡ‚Π΅Ρ€Π°Π» Π² сСгмСнтС ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° эту ΠΏΠ°ΠΌΡΡ‚ΡŒ.

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сайтах, ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅Ρ€Π΅Π΄ΠΊΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΠ³Π΄Π° Π»ΠΈΡ‚Π΅Ρ€Π°Π», ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Ρ‚ΠΈΠΏΠ° PChar, явно приводится ΠΊ этому Ρ‚ΠΈΠΏΡƒ. РазбСрСмся, Ρ‡Ρ‚ΠΎ это Π΄Π°Π΅Ρ‚. Для этого ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π½Π° Ρ„ΠΎΡ€ΠΌΡƒ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈ напишСм Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… ΠΈΡ… наТатия ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ (листинг 3.18. ΠΏΡ€ΠΈΠΌΠ΅Ρ€ PCharLit Π½Π° ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дискС).

Листинг 3.18. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² ΠΊ Ρ‚ΠΈΠΏΡƒ PChar

procedure TForm1.Button1Click(Sender: TObject);

begin

 Application.MessageBox('Text', nil, 0);

end;


procedure TForm1.Button2Click(Sender: TObject);

begin

 Application.MessageBox('A', nil, 0);

end;


procedure TForm1.Button3Click(Sender: TObject);

begin

 Application.MessageBox(PChar('Text'), nil, 0);

end;


procedure TForm1.Button4Click(Sender: TObject);

begin

 Application.MessageBox(PChar('A'), nil, 0);

end;

ΠœΠ΅Ρ‚ΠΎΠ΄ TApplication.MessageBox ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ нСпонятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ‚ΠΈΠΏΠ° PChar вмСсто string, ΠΈ ΠΌΡ‹ этим Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ. ΠŸΡ€ΠΈ Π΅Π³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ с тСкстом, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌ Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° (Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ написано Ошибка, Ρ‚.ΠΊ. Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρƒ нас nil). НаТатиС Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΈ Π²Ρ‚ΠΎΡ€ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Π½Π΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ Π½ΠΈ ΠΊ ΠΊΠ°ΠΊΠΈΠΌ нСоТиданностям β€” ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ Π½Π° экранС Text ΠΈ А соотвСтствСнно. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΊΠΎΠ΄Ρƒ с явным ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΊ PChar. НаТатиС Π½Π° Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΊ ΡΡŽΡ€ΠΏΡ€ΠΈΠ·Π°ΠΌ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚, Π° Π²ΠΎΡ‚ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡƒΡŽ даст ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Access violation.

ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ это ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° зависит Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ Π΅Π³ΠΎ Π²ΠΈΠ΄Π°, Π½ΠΎ ΠΈ ΠΎΡ‚Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠ°ΠΊΠΎΠΌ контСкстС ΠΎΠ½ упомянут. НапримСр, Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Π» 'Xest' ΠΌΠΎΠ³ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΈΠΏ string ΠΈΠ»ΠΈ PChar Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠ½ присваивался. Π’Π°ΠΌ, Π³Π΄Π΅ явного привСдСния Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅Ρ‚, Ρ‚ΠΈΠΏ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ опрСдСляСтся ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΈ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°Ρ… наТатия ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… ΠΊΠ½ΠΎΠΏΠΎΠΊ компилятор создаСт ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ 'Text' ΠΈ 'А' Ρ‚ΠΈΠΏΠ° PChar. Π―Π²Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΊ Ρ‚ΠΈΠΏΡƒ PChar мСняСт контСкст, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»ΠΈΡ‚Π΅Ρ€Π°Π» упомянут, ΠΈ компилятор ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ΅. Π’ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ компилятор ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π»ΠΈΡ‚Π΅Ρ€Π°Π» ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ PChar ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ эквивалСнтный ΠΊΠΎΠ΄Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. А Π²ΠΎΡ‚ Π² случаС привСдСния ΠΊ Ρ‚ΠΈΠΏΡƒ PChar Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° 'А' компилятор ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ этот Π»ΠΈΡ‚Π΅Ρ€Π°Π» Π½Π΅ Π·Π° строковый, Π° Π·Π° ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ (Ρ‚.Π΅. Π·Π° Π»ΠΈΡ‚Π΅Ρ€Π°Π» Ρ‚ΠΈΠΏΠ° Char), состоящий ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа Π±Π΅Π· всяких Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΉ Π΄Π»ΠΈΠ½Ρ‹, символа #0 ΠΈ Ρ‚.ΠΏ. ΠŸΡ€ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠΈ выраТСния Ρ‚ΠΈΠΏΠ° Char ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ (Π² Ρ‚ΠΎΠΌ числС ΠΈ ΠΊ PChar) ΠΎΠ½ΠΎ рассматриваСтся ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ любого порядкового Ρ‚ΠΈΠΏΠ°, ΠΈ Π΅Π³ΠΎ числСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ становится числСнным Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ указатСля. Π’ нашСм случаС это символ с ΠΊΠΎΠ΄ΠΎΠΌ 65 ($41 Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠΉ записи), поэтому Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ $00000041. Π’Π°ΠΊΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Ρƒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти, которая Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ отобраТаСтся Π½Π° Ρ„ΠΈΠ·ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ°ΠΌΡΡ‚ΡŒ, поэтому Π΅Π³ΠΎ использованиС ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ошибкС Access violation.

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ явноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Π° ΠΊ Ρ‚ΠΈΠΏΡƒ PChar Π»ΠΈΠ±ΠΎ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ отраТаСтся Π½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ компилятором ΠΊΠΎΠ΄Π΅ (Π² случаС Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… символов), Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° (Π² случаС ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ²). Если Π΅Ρ‰Π΅ ΡƒΡ‡Π΅ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΠΎΠ² ΠΊ PChar Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π»ΠΈΡ‚Π΅Ρ€Π°Π»Ρ‹ ΠΊ PChar Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ источник ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ΠΏΠ»ΠΎΡ…ΠΎΠ³ΠΎ оформлСния ΠΊΠΎΠ΄Π°. 

3.3.4. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ строк

Для Ρ‚ΠΈΠΏΠΎΠ² PChar ΠΈ AnsiString, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ указатСлями, понятиС равСнства Π΄Π²ΡƒΡ… строк ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚ΠΎΠ»ΠΊΠΎΠ²Π°Ρ‚ΡŒΡΡ двояко: Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ равСнство ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π»ΠΈΠ±ΠΎ ΠΊΠ°ΠΊ равСнство содСрТимого памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ эти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ρ‚.ΠΊ. ΠΎΠ½ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎΠΌΡƒ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ равСнства строк. Для Ρ‚ΠΈΠΏΠ° AnsiString Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΈΠΌΠ΅Π½Π½ΠΎ этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Ρ‚.Π΅. ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ строки ΠΌΠΎΠΆΠ½ΠΎ, Π½ΠΈ ΠΎ Ρ‡Π΅ΠΌ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ. Π‘ΠΎΠ»Π΅Π΅ слоТныС ситуации ΠΌΡ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Companions. Π’ Π½Π΅ΠΌ ΠΎΠ΄ΠΈΠ½Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ситуаций.