2013-09-25 2 views
0

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

int main() 
{ 

    char ***x = "jjhljlhjlhjl"; 

    char ***q = "asddfwerwerw"; 

    **q = **x; 

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

} 

Выход: неисправность 1 Сегментация

+2

Совет: вы не понимаете указатели. – John3136

+0

OT: 'main()' пропускает 'return ;' statement. – alk

ответ

2

«ошибка сегментирования» не является выход, это признак того, что ваша программа разбился.

Это не должно удивлять, потому что строковые литералы - это char*, а не char***. Попытка удвоить обезвреживание таких указателей - это неопределенное поведение, поскольку оно переинтерпретирует содержимое строкового литерала как указатель на char. Это то, что вызывает крушение.

Вы можете изменить свою программу следующим образом, чтобы сделать его законным:

int main() { 
    char *x = "jjhljlhjlhjl"; 
    char tmp[] = "asddfwerwerw"; 
    char *q = tmp; 

    *q = *x; 
    // This will produce an output that should be easy to explain: 
    printf("x:%s\n",x); 
    printf("q:%s\n",q); 
} 
+0

привет, может у сказать, как строка хранится в «х», если она определяет как char *** x? isit not (x -> address1 -> address2 -> address3 "string")? – user1998844

+0

@ user1998844 Это 'x', который определяется как' char *** ', а не строка. Строка всегда является символом 'char *', поэтому ваше назначение является незаконным. Включите все предупреждения, чтобы увидеть, как компилятор жалуется на это. – dasblinkenlight

3

Это то, что вы должны иметь:

#include <stdio.h> 

int main(void) { 

    char *x = "jjhljlhjlhjl"; 

    char *q = "asddfwerwerw"; 

    q = x; 

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

    return 0; 

} 

Если вы хотите инициализировать строку символов, используйте char *x Дон Не используйте ***x. Это означает, что указатель на указатель на указатель на символ. Надеюсь, что помогает.

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