C语言中一个问题,我定义了两个长度为20的字符数组,结果我在数组的时候都超过了字符的数组的长度了
C语言中一个问题,我定义了两个长度为20的字符数组,结果我在数组的时候都超过了字符的数组的长度了,为什么不报错,还能正常运行呢!代码如下,结果如下:main(){char...
C语言中一个问题,我定义了两个长度为20的字符数组,结果我在数组的时候都超过了字符的数组的长度了,为什么不报错,还能正常运行呢!代码如下,结果如下:
main()
{
char str1[20],str2[20];
int i;
gets(str1);
gets(str2);
for(i=0;str2[i]!='\0';i++);
printf("%s:%d\n",str1,strlen(str1));
printf("%s:%d\n",str2,i);
printf("%s:%d\n","I like C",strlen("I like C"));
system("PAUSE");
} 展开
main()
{
char str1[20],str2[20];
int i;
gets(str1);
gets(str2);
for(i=0;str2[i]!='\0';i++);
printf("%s:%d\n",str1,strlen(str1));
printf("%s:%d\n",str2,i);
printf("%s:%d\n","I like C",strlen("I like C"));
system("PAUSE");
} 展开
3个回答
展开全部
字符串是动态数组,只要初始化就行了,str1=""就能初始化;不需要分配固定内存空间。。。。在其他语言里不仅有动态字符数组,还有动态非字符数组,都不需要限定长度,这些数组是通过结束符来判断长度的,内存是动态的,只需要初始化,初始化其实就是给数组加一个结束符,以便判断长度。。。
其实就是并不是所有数组都需要加[n]这个长度符号的,这只是最早的C语言不识别动态数组才特意加的(现在的C语言也不支持动态数组,只支持字符数组),动态数组的坏处就是可能占用其他变量内存,但这个在其他语言里编译器替你解决,不需要你操心,c语言不会判定越界。。。
其实就是并不是所有数组都需要加[n]这个长度符号的,这只是最早的C语言不识别动态数组才特意加的(现在的C语言也不支持动态数组,只支持字符数组),动态数组的坏处就是可能占用其他变量内存,但这个在其他语言里编译器替你解决,不需要你操心,c语言不会判定越界。。。
追问
能详细点吗?谢谢了!既然又结束符可以通过函数判断字符串的长度,为什么还要定义数组的长度呢?那刚开始定义数组长度岂不是多余的了?
追答
你定一个数组长度主要是防止越界,申请固定长度,比如20,系统会为你分配连续的20个内存单元,这20个就属于该数组专用,坏处是可能占了过多的空间,但不存在越界问题。。。
如果是动态数组,也许你有连续30个内存单元没人申请,而第31个被申请了,这样如果你数组动态延长到30以上就会出现占用别人的内存的情况,这样别人的变量就被你错误的修改。。。所以C语言的做法就是定长度,但char*不需要定长度,但用也要小心,一般char*会默认最长255bit(delphi短字串就这样),超过255就可能越界。。。。其实内存空间很大的,一般申请100,200不算长,其他软件编译器会替你绕过别人的内存,还是刚才的问题,31-50被占了,51没占,编译器替你跳过去,数组的第31位从内存地址的51开始,但C语言不会。。。
尽量不要用动态数组,VB之类的可以,是因为他有一个数组类专门解决越界问题,C语言可不行,C语言尽量少用这种方法。。。
展开全部
C语言是不对数组是否越界进行检查的,这个责任全部推给了编程者,明显的坏处是,一旦造成内存覆盖,发生的问题诡异,且难以捉摸,足以让人抓狂!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数组越界大约会造成三种错误,
1,幸运,什么错误都没发生
2,可能会修改自己程序中的某个数据的值
3,如果在linux下,会发生断错误
所以数组越界不是什么好事
这三种情况发生的概率不确定,正好的我就发生了1的情况
例如以下代码
int n = 10;
printf("n = %d\n",n);
int arr[3];
arr[3] = 20;//这里的下标再换大一点,如arr[30],arr[300],arr[3000]...
printf("n = %d\n",n);
printf("arr[3]=%d\n",arr[3]);//这里也对应上,上面改成几就换成几
//这几个代码放到主函数里试试,就会发生我说的那三种情况
1,幸运,什么错误都没发生
2,可能会修改自己程序中的某个数据的值
3,如果在linux下,会发生断错误
所以数组越界不是什么好事
这三种情况发生的概率不确定,正好的我就发生了1的情况
例如以下代码
int n = 10;
printf("n = %d\n",n);
int arr[3];
arr[3] = 20;//这里的下标再换大一点,如arr[30],arr[300],arr[3000]...
printf("n = %d\n",n);
printf("arr[3]=%d\n",arr[3]);//这里也对应上,上面改成几就换成几
//这几个代码放到主函数里试试,就会发生我说的那三种情况
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询