int main ()
{
/*
char a[] = "abc";
printf("strlen(a): %li", strlen(a));
printf("\nsizeof(a): %li", sizeof(a));
*/
char b[3];
printf("\nstrlen(b): %li", strlen(b));
printf("\nsizeof(b): %li", sizeof(b));
printf("\nb = ");
puts(b);
return 0;
}
当我运行上面的代码时,它输出以下内容:
长度(b):1
大小(b):3
乙 =
但如果我撤消评论,它会输出:
链(一):3
大小(a):4
长度(b):6
大小(b):3
b = abc
为什么会发生这种情况?我希望能对它进行深入的解释,如果可能的话,我会对其进行快速“修复”,这样我就不会再遇到这个问题了。
总的来说,我是编程和 C 方面的初学者,根据我迄今为止学到的知识,这不应该发生
如果我违反了本网站的任何规则,谢谢和抱歉,我也是新来的!
uj5u.com热心网友回复:
strlen(b)
导致未定义的行为,因为阵列b
未初始化。因此阵列的内容是不确定的。 strlen
如果阵列的垃圾内容中碰巧有空字节(充当空终止符),则可能回传一个小数,如果阵列中没有空位元组但存储器中有一个空位元组与它相邻,则可能回传一个大数(访问时碰巧不会崩溃),或者它可能会出现段错误,或者以其他一些不可预测的方式失败。您观察到的特定不当行为很容易取决于附近其他存储器的内容,因此会受到添加或洗掉其他变量或以明显不相关的方式更改周围代码的影响。
puts(b)
同样是未定义的行为。
(另一个错误:sizeof
与strlen
两者的回报size_t
,为此,正确的printf
格式说明%zu
,不是%li
这将是long int
。)
不要试图读取或使用尚未初始化的区域变量的内容。
另请参见C 中宣告的未初始化变量会发生什么?它有价值吗?和(为什么)正在使用未初始化的变量未定义行为?.
如果您启用编译器警告,您的编译器可以警告您有关此示例的某些实体,例如gcc 捕获此示例。valgrind 之类的工具也可以提供帮助。
相反,这种行为在 C 中极为常见。C 语言不保证对此类错误进行任何检查,并且实作通常不提供它们。你应该习惯这样一种可能性,即语言不会阻止你做一些错误的事情,而是会以不可预测的方式行为不端(或者更糟的是,似乎可以正常作业一段时间)。因此,在用 C 编程时,与使用“更安全”的语言相比,您必须更加小心和注意语言规则。对于初学者来说,这是一种艰难且不友好的语言。
0 评论