第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);
}
这种情况下,输入了百来个字符可能还没异常