问题描述
- 简单的vc+问题,char的内存大小
-
在下看书的时候是说
char abc [15];
那么abc就只能放14个字节的内容
但是我输入sdkfoeldkejllsk,程序没有报错是为什么呢
上一行是输入了十五个字母
后来我又试了试16个字母,就不举例子了,但还是通过了验证
一直到17个菜出现溢出。
解决方案
首先你申请了15个字节大小的内存,然后一般情况下,你只能用14个大小,最后一个你要赋值为'',以标示这个字符串的结束。如果你放了15个字符串,而没有在字符串的末端添加结束符,你在使用strcpy等函数时,程序会一直寻找结束符,而不是你定义了多大,他就访问多大。所以你输了16个字符
,那么在系统看来,你的字符串在第十六个字符还没有结束,他认为你的字符串在第十六个字符之后首次出现结束符的地方结束。那么问题来了,你这样是会访问你不该访问的内存单元的,所以你写是没问题的,问题是当你越界写数据的时候,如果这个内存单元是系统再用,你那就非法访问了,程序就挂了。
解决方案二:
刚刚在网上找到说的过去的答案,也感觉挺在理的。给你借鉴下吧~
字符数组其实就是字符指针 你这样使用实际上是访问了没有保护的内存地址 也就是说读取(甚至写入)了未分配的内存 相当于偷偷占用了不属于你的内存空间 如果没遇到冲突貌似相安无事 如果遇到冲突则程序会出错(其实直接读取未分配的内存已经是出错了)这是非常严重的bug 必须避免
解决方案三:
abc只是单纯的指针,处理成字符串的时候,寻找'',如果没有,就一直向后找。
当你赋值的时候,可以赋值成无限长,但是它之后的内存有可能分配给其他元素了,所以就出错了。
这就是指针的灵活性,也算缺点吧
解决方案四:
你定义了char数组abc,长度是15,可以存放15个字符,没问题。
但是如果存放了15个字符,这里面没有字符串结束标志的话,那你就不能把这个数组当字符串来使用了。
所以有的书说最多存放14个字符,最后一个放字符串结束标志0,即abc[14]=0;
如果你不想当字符串使用,只是作为存放字符的数组使用,存放15个字符没问题。
时间: 2024-12-24 20:48:57