C语言关于数组空间大小的问题

问题是无论我怎么输入,为什么数组每个格子里的空间都是足够的,不会出现截断,程序出错,这是什么原因?不是说char只有一个字节吗?那么,数组每个格子里不是只能存放1个字母,可为什么我下列程序代码却没有错误。
int main(void)
{
int i = 0;
char a[1];
scanf("%s",a);
printf("%s",a);
system("PAUSE");
return 0;
}

是这样的:定义char a[1]的时候,计算机给这个数组分配了存放空间,这个空间的首地址为a,空间大小为仅仅能存放一个字符的空间。但是为什么你输入很多字符,然后运行,仍然能正确输出呢?问题在于a是一个首地址,c默认是你知道你要操作的对象是多长的。如果你把3个字符“xyz”强行送给地址a,那么,他就把x存放在a的位置,y存放在a+1的位置,z存放在a+2的位置,依次向后递增,这就是指针。

由于你输入的字符串并不是很长,相对于现在计算机的内存,微不足道,所以没有发生溢出的错误,程序就不报错。如果你输入很长的字符串,恰巧到了a+n,而a+n正在被其他进程使用,那么就惨了,计算机可能提示你溢出了,或者内存非法使用了。此时应该定义足够长的数组,比如char a[1000],使计算机一开始就给你分配足够的内存,问题就不会再出现了。

但愿能帮到你噢~~~
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-06
在VC++ 2005调试会报执行错的。
char a[1];//数组a只有一个元素
scanf("%s",a);//将输出的字符放入以地址a开始的单元中,且最后一个字符为'\0',显示数组超界了。
//C语言不对数组超界作检查。
printf("%s",a);//输出字符串
system("PAUSE");
return 0;//这时VC2005发现数组超界,报错!可能有些C版本不报!
第2个回答  2011-03-06
我觉得是因为你输入的字符串被看成是一个字节存储在一个单元格中
第3个回答  2011-03-06
你这的定义char a[1];有问题,你数组只定义一个元素,那还要定义数组干什么呢?
换成 char a[100];
第4个回答  2011-03-06
我怎么记得是
scanf("%s",a);
还是
printf("%s",a);
中有一个的参数应该加上&符号呢!可是我见这些都没有写那个符号~~

信息来源:黑**=吧=**安全网
只有不想学的,没有学不会的--------神马 年代
////////////////////////////////////////////////////////////////////////////////
九年悠久历史! 业界公认水平~
相似回答