未初始化的char默认为@

时间:2016-06-14 20:33:27

标签: c variables initialization

所以我写了这个函数:

int getword(char *fmt, int delim, int max, FILE *f)
{
    int c, x = 0;
    while (((c = getc(f)) != EOF) && (c != delim) && (x < max))
            fmt[x++] = c;
    return x;
}

每当我检查该功能时,最后总会有一个@

buf = color 32@
/* segmentation fault */

无论我做了什么改变它,变量总是以@结束。我通过初始化变量来解决问题:

char buf[100] = {0};

但是,自从我一直想知道如果未初始化的@可以是其范围内的任何内容,该字符始终为char。为什么默认为@

3 个答案:

答案 0 :(得分:1)

原始代码缺少清除buf[],甚至char buf[100] = {0};也不能确保在读取100个字符时终止空字符。否则printf("buf is %s\n",buf);会尝试打印可能无效的字符串。

此外,在后续调用中char buf[100] = {0};不会将数组重新归零。

最好使用getword(buf,'>',sizeof buf - 1,f);getword()追加'\0'

  

为什么它会默认为@

这是未定义的行为。在您的情况下,buf[]可能包含'@',但可能发生了任何事情。它没有默认'@'

答案 1 :(得分:1)

你需要零终止你的字符串

int getword(char *fmt, int delim, int max, FILE *f)
{
    int c, x = 0;
    while (((c = getc(f)) != EOF) && (c != delim) && (x < max))
            fmt[x++] = c;
    fmt[x] = 0;
    return x;
}

你得到了一个&#39; @&#39;因为那就是内存中剩下的东西,几乎可以肯定是shell或者加载器。而且每次你​​获得相同的随机垃圾时,shell或loader都是一样的。如果你稍微摇晃你的程序(在buff之前添加一些额外的变量),你会得到一个不同的垃圾。

答案 2 :(得分:0)

从未初始化的局部变量读取会调用未定义的行为。该计划可以随心所欲地做任何事情。