在c中初始化字符串给出奇怪的输出

时间:2014-07-06 07:09:44

标签: string char initialization printf

下面显示的代码旨在首先操作字符串p的内容然后打印其内容。我使用两个while循环和一个printf语句测试了代码。

#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;
}

输出:

xxx@ubuntu:~$ gcc -o test test.c
xxx@ubuntu:~$ ./test
Hello1
Hello1
Hello

现在,我有两个问题,首先,在打印这7个字符(包括NULL)后,前两行中的所有垃圾值都显示在哪里。其次,为什么printf语句的输出是'Hello'而应该是'Hello1'??

2 个答案:

答案 0 :(得分:1)

予。由于两个原因,没有垃圾。一个是那个

char p[10] = "Hello";

等同于

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

我。即它将未列出的成员初始化为零(更确切地说,它将它们初始化为static)。

其次,即使它们真的没有初始化,你也没有权利期望垃圾价值。读取未初始化的变量只是未定义的行为,因此可能存在任何内容。

II。因为您最终编写了'1' 过去 NUL终结符,因为您遍历字符串的方法是错误的。因此,遍历每个字符的putchar的for循环将打印所有字符,包括过去的NUL '1',但printf()将在遇到的第一个NUL处终止。 TL; DR:而不是

while *(a++);

你应该写的

while (*a)
    a++;

答案 1 :(得分:0)

请稍等片刻后删除;,不要再增加a两次......