В самом деле,
c:= PChar('*');
скомпилирован как
mov [c],$0000002a
, как если бы оно было написано:
c:= PChar(ord('*'));
С ord('*')=$2a
, оказывается, что '*'
характер тип- (NativeInt
), то это целое число преобразуется в указатель. Поэтому, когда вы пытаетесь получить доступ к содержимому c
, вы получаете доступ к адресу памяти $0000002a
, что является недопустимым и вызывает нарушение доступа.
При компиляции:
c:= PChar('**');
Он формируется как
mov eax,$00548984
mov [c],eax
В этом случае константа # 0 состава текстовый буфер (а не Delphi string
) генерируется компилятором в пределах исполняемого файла, а c
- по его адресу.
Тот факт, что PChar('*')
не ведет себя одинаково, является одной «оптимизацией» типа char
, которая может быть преобразована в целое число.
Но я понимаю, что это может ввести в заблуждение.
Если вы хотите просто указатель на один символ «*», то вы можете написать либо:
c:=PChar('*'#0);
c:=PChar(string('*'));
, который будет работать, как и следовало ожидать, так как будет миновать бросок к символу порядкового значения.
Пожалуйста, укажите, что вы подразумеваете под «AV» точно –
Ваш код не имеет смысла. Во-первых, он работает. Во-вторых, вам не нужно вводить тип в строку. 's: = c;' отлично работает без него и 'ShowMessage (s);' или 'ShowMessage (c);' оба работают также. –
теперь редактировал код. пожалуйста, посмотрите сейчас –