Почему printf (“%s”, ptr) может разыменовать пустоту*?

То, когда мы говорим о, разыменовывают, является этим необходимый это * должен использоваться в нем? Если мы получаем доступ к референту указателя некоторым другим способом, может он рассматриваться как разыменование указателя или нет, как:

char *ptr = "abc" ;
printf( "%c" , *ptr ); // Here pointer is dereferenced.
printf( "%s" , ptr );  // What about this one?

Это - первая часть моего вопроса.

Теперь, если printf( "%s" , ptr ) пример разыменования затем доброжелательного ответа следующая часть моего вопроса также.

K&R говорит

"указатель на пустоту" используется для содержания любого типа указателя, но не может быть разыменован самого

Следовательно,

char a = 'c' ;
char *p = &a ;
void *k = &a;
printf( "\n%c\n" , *p );
printf( "\n%c\n" , *k );

Не компилирует, компилятор дает ошибку

В 'основной' функции: предупреждение: разыменование ‘пусто *’ ошибка указателя: недопустимое использование пустого выражения

Но если мы используем

char *a = "c" ;
char *p = a ;
void *k = a;
printf( "\n%c\n" , *p );
printf( "\n%s\n" , k );

Это компилирует и работает. То, что означает, что пустой указатель может быть разыменован - у нас есть объектный указатель, относится к.
Если это так, затем, что делает вышеупомянутые средства кавычки K&R в этом контексте?

Спасибо за внимание.

7
задан Andrew-Dufresne 28 July 2010 в 11:06
поделиться

1 ответ

Нет. у вас есть «неопределенное поведение» - стандарт языка C не говорит, что должно произойти. В вашем случае он «работает», но для другого пользователя / компилятора / платформы может и не работать. Ваше утверждение:

printf( "\n%s\n" , k );

эквивалентно:

int k = 42;
printf( "\n%s\n" , k );

и также не определено.

9
ответ дан 7 December 2019 в 03:09
поделиться
Другие вопросы по тегам:

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