未初始化的char默认为@

问题描述:

所以我写了这个功能:未初始化的char默认为@

​​

每当我检查功能,总有一个@末。

buf = color [email protected] 
/* segmentation fault */ 

无论我怎样改变它,变量总是以@结尾。我通过初始化变量固定的问题:

char buf[100] = {0}; 

但自从我一直在想,为什么性格始终是一个@如果未初始化char可在其范围内任何东西。为什么它默认为@

+3

未定义的行为是未定义的行为。 –

你需要零终止您的字符串

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

你得到一个“@”因为多数民众赞成什么遗留下来的内存,几乎可以肯定的外壳或加载器。而且因为每次你得到相同的随机垃圾时,shell或loader都是一样的。如果你稍微摆弄你的程序(在buff之前添加一些额外的变量),你会得到一个不同的垃圾。

从未初始化的本地变量读取调用未定义的行为。该程序可以*地做任何事情。

+0

但UB会导致随机性,不是吗?变量并未完全未初始化;它是由'getword'写的。 – 112

+2

@ ProHackr112“未定义”并不意味着“随机” –

原始代码缺少清除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[]包含'@',但可能发生任何事情。它没有默认'@'