линия, о которой вы спрашиваете:
printf ("%s", * pok);
проходит два аргумента printf
. Первая - это строка формата "%s"
. Второй * pok
, то есть значение, при котором pok
баллов. Так как вы написали pok = & niz[10];
(с ненужным приведением к (unsigned char *)
- бросить как можно меньше!), pok
точек на niz[10]
, который является неинициализированными unsigned char
, которая может иметь любое значение от 0
к UCHAR_MAX
; потому что это передается аргументу неуказанного типа, перед передачей ему присваивается int
, но все же имеет такое же числовое значение.
Управление теперь переходит к printf
, который извлекает строку формата "%s"
и, поскольку он видит спецификатор строки, интерпретирует остальную часть списка аргументов как содержащую адрес строки, из которой он пытается получить символы в строка по одному, пока не найдет завершающий нуль. Что происходит тогда неопределенные, но есть два возможных варианта:
- Если тип
char *
имеет такой же размер, как int
, он будет извлекать значение niz[10]
, и интерпретировать его как очень низкий адрес. Этот адрес, скорее всего, будет считаться недействительным процессором, что приведет к нарушению адреса и остановке вашей программы.
- Если тип
char *
больше int
, он подберет некоторые дополнительные биты, которые могут находиться в верхней или нижней части адреса, в зависимости от того, как ваша система организует память. Вы получите довольно случайный адрес, который, вероятно, будет недействительным, с тем же результатом, что и в предыдущем случае.
В любом случае возможно, что адрес будет таким, который вы можете читать; в этом случае программа будет печатать содержимое этого и последующих адресов в предположении, что они являются печатаемыми символами, что может сделать странные вещи с вашим терминалом, если они не являются (если вы не подключите вывод к команде, такой как od -oc
). Это будет продолжаться до тех пор, пока один из этих непредсказуемых символов не будет равен нулю, и в этом случае он остановится или адрес станет недействительным, и в этом случае ваша программа остановится с нарушением адреса.
Программа будет демонстрировать неопределенное поведение в двух учетных записях: использование неинициализированной переменной и использование неправильного формата в 'printf'. –
Подумайте об этом: каков тип выражения '* pok' в вызове' printf'? – juanchopanza
Я попытался с 'printf ("% d ", * pok)', и он говорит 0. Почему допустимо, что если '* pok' является типом char? – HardRock