未初始化的char默认为@
所以我写了这个功能:未初始化的char默认为@
每当我检查功能,总有一个@
末。
buf = color [email protected]
/* segmentation fault */
无论我怎样改变它,变量总是以@
结尾。我通过初始化变量固定的问题:
char buf[100] = {0};
但自从我一直在想,为什么性格始终是一个@
如果未初始化char
可在其范围内任何东西。为什么它默认为@
?
你需要零终止您的字符串
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之前添加一些额外的变量),你会得到一个不同的垃圾。
从未初始化的本地变量读取调用未定义的行为。该程序可以*地做任何事情。
但UB会导致随机性,不是吗?变量并未完全未初始化;它是由'getword'写的。 – 112
@ 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[]
包含'@'
,但可能发生任何事情。它没有默认到'@'
。
未定义的行为是未定义的行为。 –