C - Различие между “символьным var []” и “символом *var”?

Я ожидаю, что оба после векторов имеют то же представление в RAM:

char a_var[] = "XXX\x00";
char *p_var  = "XXX";

Но странный, вызов к библиотечной функции типа f(char argument[]) crushs запущенное приложение, если я называю это использованием f(p_var). Но использование f(a_var) в порядке!

Почему?

16
задан Josh Lee 15 December 2009 в 20:06
поделиться

3 ответа

Первый создает массив символов, содержащий строку. Содержимое массива можно изменять. Второй создает указатель символа, который указывает на строковый литерал. Строковые литералы не могут быть изменены.

28
ответ дан 30 November 2019 в 17:52
поделиться

Массивы можно рассматривать (обычно) как указатели, но это не означает, что они всегда взаимозаменяемы. Как сказал другой, ваш p_var указывает на литерал, что-то статическое, которое нельзя изменить. Он может указывать на что-то еще (например, p_var = & a_var [0]), но вы не можете изменить исходное значение, указанное вами в кавычках ....

Аналогичная проблема возникает, когда вы определяете переменную как массив в один файл, а затем использовать extern как указатель.

С уважением

0
ответ дан 30 November 2019 в 17:52
поделиться

Предположительно функция f изменяет содержимое переданной ей строки.

1
ответ дан 30 November 2019 в 17:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: