2015-02-12 4 views
1

У меня действительно глупый вопрос ... Почему этот код:Casting литералов в PChar/PAnsiChar

PChar('x'); 

причина ошибка "Нарушение прав доступа"? Оптимизация компилятора?

Пример:

var s: String; 
... 
s := StrPas(PAnsiChar('x')); 

Это приводит к AV в Delphi 5/Delphi XE

Или этот:

Windows.MessageBox(0, PChar('x'), PChar('y'), 0); 

Это приводит к AV в Delphi 5, но не в Delphi XE В XE есть пустой MessageBox

Пример консоли:

program Project1; 
{$APPTYPE CONSOLE} 
uses 
    SysUtils, Windows; 
var s: String; 
begin 
    s := StrPas(PChar('xxx')); // EAccessViolation here 
end. 
+0

Другой действительно глупый вопрос: какую версию Delphi вы используете? И как это можно воспроизвести? Потому что только эта линия не будет компилироваться. –

+0

Исправленных + примеры мне нужно изменить строку переменных литералов для тестирования, и я был немного удивлён ... @David Хеффернано Это точка XD –

+3

Интересно. Является ли '' х '' символом символа? И вот только один символ? Возможно, это то, чего мне не хватает. –

ответ

3
StrPas(PAnsiChar('x')); 

Я утверждаю, что 'x' трактуется как символ буквального, а не строковый литерал. И поэтому приведение недействительно. Если это так, то это будет работать так, как вы ожидаете.

StrPas('x'); 

из-за неявного преобразования. Или

StrPas(PAnsiChar(AnsiString('x'))); 

благодаря явному преобразованию.

Я думаю, что первое, вероятно, будет предпочтительным. Литералы не нуждаются в литье в нуль-концевые типы указателей. Компилятор может исправить правильный код без приведения. И броски всегда подвергаются риску подавления ошибки.

+0

Ooook ... Вы правы. Спасибо за объяснение! :) Я добавил литерал для тестирования фрагмента кода, а затем меня немного задержали ... –

+0

Delphi здесь немного хромает. Все это связано с использованием одного и того же разделителя для строк и символов. –

Смежные вопросы