C语言二维字符数组使用的误区
误区:在C语言的教学中,发现很多学员老出现这个问题,在定义字符二维数组上,这样定义char buf[][50]={0};后面使用buf[0],buf[1]....总觉得有无穷无尽可以使用。调试无果:一开始,学员用的没有问题,等项目代码多了,系统变大了,就出现些莫名其妙的问题,调试半天就找不出根源。原因:实际上就出在这个定义上,这样定义变量就像给系统埋了个定时炸弹,留下隐患。我们说,定义变量后系统就会开辟一定的内存空间,char buf[][50]={0},这样的定义实际上就只有一个50个字节的内存空间,你若不信,可用sizeof测试下。那为什么还能使用buf[1]呢?系统怎么不报错呢?首先数组是特殊的指针,buf[0]的首地址是buf[0][0],buf[1]的首地址系统就会推算为buf[0][0]+1*50,当你用strcpy(buf[1],"student");系统将会从buf[1]的首地址开始存“student”的数据,但是这些数据是不受保护的,因为buf的合法空间是50个字节,也就是系统会认为后面的空间是闲置的,所以当系统变大,变量使用的多时,内存区不够使用,或刚好使用这块区域,系统读取数据就会混乱,造成系统崩溃,并且这种错误系统报的错经常是不会指向这里的,所以调试就会很困难,再者,VC本身不检查下标的越界,所以就很难找出错误的根源。