Я выполнил следующий код.Почему разрушение слова таким образом рушится?
#include <stdio.h>
int main()
{char *a="awake";
printf("%s\n", *(a+1));
return 0; // expected out_put to be wake
}
Я выполнил следующий код.Почему разрушение слова таким образом рушится?
#include <stdio.h>
int main()
{char *a="awake";
printf("%s\n", *(a+1));
return 0; // expected out_put to be wake
}
*(a+1)
такая же, как a[1]
который является char
, не char *
что printf
ожидает за %s
.
РЕДАКТИРОВАТЬ: уточнение: printf
необходим адрес для %s
спецификатора, a+1
является таким адресом (а именно адрес второго символа в строке), но *(a+1)
затем дает значениепо этому адресу. Это всего лишь символ и, скорее всего, не действительное место памяти для printf
для чтения.
Вы разыменования указателя, что делает его char
но пытается вывести строку. Изменение оператора печати на printf("%s\n", a+1);
Возможно, я ошибаюсь, но насколько я знаю, в этом случае символ + 1 указывает адрес строки, но не значение, хранящееся в строке. Поэтому я использовал * (a + 1) для достижения символов, начиная с w i.e. wake (хотя и не работал). я не понимал, как это было напечатано, хотя мы дали только один адрес. –
Вы не хотите defrefeence char *
:
printf("%s\n", (a+1));
делает то, что вы хотите.
Может быть, я совсем не прав, но насколько я знаю, в этом случае + 1 дает адрес строки, но не значение, хранящееся в строке. Поэтому я использовал * (a + 1) для достижения символов, начиная с w i.e. wake (хотя и не работал). я не понимал, как это было напечатано, хотя мы дали только один адрес. –
Может быть, я совсем не прав, но насколько я знаю, в этом случае символ + 1 указывает адрес строки, но не значение, хранящееся в строке. Поэтому я использовал * (a + 1) для достижения символов, начиная с w i.e. wake (хотя и не работал). я не понимал, как это было напечатано, хотя мы дали только один адрес. –
'a + 1' * является * адресом второго символа в строке, но' * (a + 1) 'дает значение по этому адресу. 'printf' нужен адрес, а не значение. – Kninnug
спасибо за помощь –