字符数组存放字符串问题

来源:百度知道 编辑:UC知道 时间:2024/06/05 04:46:00
#include "stdio.h"
void main()
{char a[5];
scanf("%s",a);
printf("%s\n",a);
}
如上,字符数组a所能容纳的大小是5个字符
结果我却可以输入12345678,都能正常地输出,
直至当我输入9个字符,123456789 时,系统才报错。
为什么可以输入8个字符到大小为5字符的数组里,而且还能正常输出???为什么输入9个字符以上时才开始报错???
谢谢
无论是VC还是TC都出现这个问题
TC忘了可以输入几个了,总之也是出现可以输入超过5个字符却正常输出不报错的情况
。。。。
到底有什么玄机??

我告诉你,a[5]定义的a只能装4个字符,因为还要装一个结束字符\0。

原则上,超过4个字符都是不对的,但是究竟输入多少才出问题,以及会出什么样的问题,这个是非常高深的。

我刚才在TURBO C里面,输入8个字符就出问题了,什么问题呢:窗口死了,而且是在输出了12345678之后,还要让我输入,输什么都不能退出,CTRL+BREAK都没用。

为什么稍微超出一点没有问题呢,因为计算机分配内存的时候有个对齐,比如是按照4字节对齐,那么定义的变量如果在暂用整数的多少个4字节之后,最后还需要一个字节,计算机会空3字节,这样只要在这个范围内就不出问题。

超过了变量分配的内存会出什么问题呢,本质上就是变量之后的内存会被破坏,例如你这样的定义char a[5],b[5];在a里面输入多余的内容实际上会存储在b的空间,b的数据就被破坏。我刚才测试的时候直接死了,是因为我没有在a之后定义我要使用的变量,可能那之后是系统有重要功能的数据区域。

大家知道UNIX是的程序主要都是C写的,以前看见一个小的C程序,一运行马上就出现了#提示符,摇身一变成为了超级用户,那就是利用某些系统功能的溢出进行攻击。学C的,要特别主要溢出问题。

因为你定义的这个数组是int型,要是照你说的输入早就溢出了123456789只是代表一个数字,而你的输入要有5个整形数字。所以要这样输1 2 3 4 5

因为,电脑在分配内存的时候是4个字节4个字节的分,,也就是说当你定义0到4个字符时,电脑都给你分4个字节,而当你定义5到8个字符时,电脑就分给你8个字节!~1如这类推!~

fdgdfgd