strenghen
发布网友
发布时间:2024-03-20 17:22
我来回答
共1个回答
热心网友
时间:2024-04-01 21:55
1."abcde"长度为5,但最后还有个字符串结束符,因此char
a[5]是放不下的,应该用char
a[6]
=
"abcde";char
a[5]="abcde";会导致a的每个元素都不是结束符,紧接a之后的内存区域又不被初始化(C中初始化列表超过数组大小的行为是未定义行为,这里Dev-C++显然没有因为初始化而填充不在a中的空间;C++则会在此产生编译错误),而strlen(a)是根据从(char*)a开始第一个找到字符串结束符的位置来判断的,所以结果不确定(取决于a后面的内存状态,但这个程序没有用到,所以这些值是不确定的,从而结束符的位置也不确定)。这里在a之后两个字节处找到了结束符,结果才是7。
LS错误,sizeof(a)才(在编译期静态地)计算a所占空间的大小。
2.答案是纯粹运气。因为C程序不检查数组越界访问,puts和gets不管输入/输出的长度,自然不一定会出问题。这样后果仍然是不确定的——可能换一个环境或换一台机器再运行就崩溃了,原因是非法的越界内存访问被操作系统捕获,强制程序中止。
====
[原创回答团]