2013-08-02 3 views
2

Привет, пожалуйста, сообщите мне на следующий вывод:символ указателя и Printf

main() 
{ 
    char ***x = "jjhljlhjlhjl"; 
    char **q = *x; 

    printf("x:%s\n",x); 
    printf("q:%s\n",&q);  

} 

Output: 
x:jjhljlhjlhjl 
q:jjhl 

Почему д не печатает целое х?

+1

Это 'int main()', btw. – alk

+1

На самом деле, K & R C допускает объявления функций без типов (подразумевается «int») –

ответ

5

Ваша программа вызывает неопределенное поведение, поэтому на самом деле нет никаких ограничений на то, что она может выводить.

char ***x = "jjhljlhjlhjl"; 

Хотя x является указателем на указатель на указатель, ему присваивается адрес строкового литерала.

char **q = *x; 

q является указателем на указатель, и присваивается результат разыменования x. Так как x на самом деле указывает на объект несовместимого типа, результат его переноса не определен.

Если мы делаем вид, как это должно работать, то *x теперь указатель на указатель, и поэтому оно может относиться к sizeof(char **) байт строкового литерала, как если бы это был адрес и присвоить это значение q.

printf("x:%s\n",x); 

Поскольку x является указателем, что значение указателя передается printf(). Поскольку предоставляется %s, значение указателя обрабатывается как строка. Поскольку x был назначен адрес строкового литерала, эта строка печатается.

printf("q:%s\n",&q);  

Адрес q передается printf(). Поскольку предоставляется %s, значение указателя обрабатывается как строка. Однако переупорядочение содержимого этого указателя фактически является sizeof(char **) байтами строкового литерала. Нет гарантии, что прочитанные байты будут правильно завершены NUL, так что просто случайно что-то напечатано вообще.

1

Вопрос: строка "jjhljlhjlhjl" является только char *, тогда как вы назначаете ее char ***. Когда вы печатаете x, он интерпретируется как char * на printf, который завершает правильную строку.

Что касается печати &q в качестве строкового адреса, вы фактически печатаете содержимое q. Когда вы разыскиваете x, вы получаете char **, что в вашем случае составляет 4 байта. Но поскольку x фактически указывает на текстовые данные, *x будет захватывать первые четыре байта (т. Е. Символы) вашей строки. Дело в том, что печать только четыре символа - это чистая случайность.

Смежные вопросы