2014-07-06 5 views
-1

Код, показанный ниже, предназначен для того, чтобы вначале манипулировать содержимым строки p, а затем распечатать его содержимое. Я проверил код, используя два цикла while и инструкцию printf.Инициализированная строка в c дает странный вывод

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char p[10] = "Hello"; 
    char *a = p; 
    while(*a++) 
     ; 
    *a++ = '1'; 
    *a++ = '\0'; 
    a = p; 
    int i; 
    for(i = 0; i < 10; i++) 
     putchar(a[i]); 
    putchar('\n'); 
    for(i = 0; i < 10; i++) 
     putchar(p[i]); 
    putchar('\n'); 
    printf("%s\n", p); 
    return 0; 
} 

Выход:

[email protected]:~$ gcc -o test test.c 
[email protected]:~$ ./test 
Hello1 
Hello1 
Hello 

Теперь у меня есть два вопроса, на мой взгляд, первый, Где все значения для мусора в первых двух строках, которые будут показаны после печати этих 7 символов (включая NULL) , Во-вторых, почему вывод инструкции printf равен «Hello», а должен быть «Hello1»?

ответ

1

I. Там нет мусора, по двум причинам. Одним из них является, что

char p[10] = "Hello"; 

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

char p[10] = { 'H', 'e', 'l', 'l', 'o', 0, 0, 0, 0, 0 }; 

я. е. он инициализирует незарегистрированные элементы до нуля (точнее, он инициализирует их, как если бы они были static).

Во-вторых, даже если бы они были действительно неинициализированы, вы не имели бы права ожидать значения мусора. Чтение неинициализированной переменной - это просто неопределенное поведение, поэтому там может быть что угодно.

II. Потому что вы закончили писать '1'минувшим терминатором NUL, поскольку ваш подход к итерации по строке неверен. Таким образом, цикл for с putchar, который выполняет итерацию над каждым символом, будет печатать все из них, включая last-the-NUL '1', но printf() будет завершен при первом встреченном NUL. . TL; DR: вместо

while *(a++); 

вы должны иметь письменные

while (*a) 
    a++; 
0

Попробуйте удалить ; после времени и не увеличивать a дважды ...

+0

нет, это совершенно неправильно ** ** Вы явно не поняли, что код должен делать. Если вы удалите точку с запятой после 'while', она заполнит всю строку символом' '1''. Это не то, чего хочет OP. –

+0

@ user3477950 На каком основании вы заключаете ** какой вид мусора ** нужен OP? – SomeWittyUsername

+0

Речь идет не о мусоре. Ваш ответ не отвечает первой части, он отвечает на вторую часть. (Кстати, по моему заключению: опыт. Я видел * много * людей, задающих вопросы, идентичные этому, и они всегда, недвусмысленно, без исключения, ищут «мусор» из-за отсутствия инициализации, что является миф.) –

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