c语言。1输入的时候加不加地址符都可以?2我定义的时候是s[3]但是 输入1个到4个都可以 5个就异常停?

如题所述

c语言在这方面控制的不是很严格,违规使用,可能成功,但是会出一些不可预料的错误,比如你碰到的异常。当你定义s[3]输入4个以上字符时,实际上侵占了别人的空间,那个空间可能是数据,也可能是代码。
我记得世界上有个模糊c语言编程大赛,就是利用这种不严格,发现了很多匪夷所思的编程方法,并利用这些方法产生一些不可思议的代码。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-30
1.加不加地址符都可以的说话是错误的,变参函数的部分参数被检查而可变的部分不检查类型,因此某些情况下,加不加实际效果一样
2.越界行为不一定就马上引起系统错误,上面程序输入1至2字符时是合法的,3个以上是不合法的,输入3个和4个都还没出错,5个就抛异常了,这正说明越界引起的行不的不确定性,事实上,对于内存操作的少量越界经常并不引起程序错误,这是因为内存分配时的边界对齐处理原则引起的,你看着只分配了3个字节的内存,而实则上则可能是其后的0-N个字节都未被分配而保留了,16位,32位及64位的系统,小节和边界处理是不一样的,分别以2字节4字节和8字节为一个小节.关于这个边界对齐的设置还可以在编译器的设置中改变。
上面程序如果加一点试验:
char *p;
p=s; //正确
p=&s;//错误,无法通过编译(s 和 &s 值同类型不同,s是char[]型,&s是char[][]型)
scanf("%s",p);//可以
scanf("%s",&p);//错误,运行结果将不对(p和&p值与类型都不同)
如果上面程序改为以下
main()
{
char s[3],a[100];
scanf("%s",s);
printf("%s",s);
}
这种情况下,输入了百来个字符可能还没异常
第2个回答  2012-07-30
s 和 &s的值是一样的,但是代表的意义不一样,scanf第二个参数加不加&都可以。

你字符串定义的长度是3,由于字符串需要以‘\0’结尾,所以这个只能正常录入2个字符,超过两个字符有出错的可能,所以你5个异常也是很正常的,因为已经越界,后果未知。
第3个回答  2012-07-30
1. scanf的第一个参数之后的参数是保存读入数据的存储地址,如果是数组变量和指针变量是可以不加&,其他普通类型的变量如整数、浮点数等变量,是一定要加&,否则读入的数据是不能够保存到你制定的变量中的。

2. 输入数据超过s[3]变量的存储空间,程序是可以运行,但必然覆盖其他数据或代码,会出现错误结果甚至程序崩溃,C语言给了程序员极大的自由和灵活性,同时也把代码的可靠性、安全性问题一并交有程序员考虑和把握了。
第4个回答  2012-07-30
异常,就是我们不知道系统会怎么去做,系统可能会继续正常去做,也可能错误的去做,就相当于你给了一个错误的前提,系统出正确结果,是一种可能,出错误结果也是应该的。
第5个回答  2012-07-30
数组可以不用加,单个变量要加
相似回答