Я ожидаю, что оба после векторов имеют то же представление в RAM:
char a_var[] = "XXX\x00";
char *p_var = "XXX";
Но странный, вызов к библиотечной функции типа f(char argument[])
crushs запущенное приложение, если я называю это использованием f(p_var)
. Но использование f(a_var)
в порядке!
Почему?
Первый создает массив символов, содержащий строку. Содержимое массива можно изменять. Второй создает указатель символа, который указывает на строковый литерал. Строковые литералы не могут быть изменены.
Массивы можно рассматривать (обычно) как указатели, но это не означает, что они всегда взаимозаменяемы. Как сказал другой, ваш p_var указывает на литерал, что-то статическое, которое нельзя изменить. Он может указывать на что-то еще (например, p_var = & a_var [0]), но вы не можете изменить исходное значение, указанное вами в кавычках ....
Аналогичная проблема возникает, когда вы определяете переменную как массив в один файл, а затем использовать extern как указатель.
С уважением
Предположительно функция f
изменяет содержимое переданной ей строки.