Poedu_C语言_lesson23_20160928_函数3

数组是相同类型数据的集合,数组名是首地址,通过指针进行数据的操作。比如字符串的存储我们就经常通过数组实现,但是我们在字符串的操作上要注意一些地方,不要一不小心掉坑里了。我们一起来看一段代码:

首先,下一个断点,运行起来,我把把程序停留在第8、第9行,看一下输出的结果:

ok,程序没有报错,输出的值也在我们的意料之中。来分析一下接下来的代码(第11至第13行):

第11行,我们对于string[10]中的第2个数(因为数组下标的是从0开始的)进行了改写,如果再进行string的输出,那么结果应该是1A23456789;

第12行,和11行所做的操作是一样的,只是值不同而已,好理解,就不再赘述,如果在此处输出,那么结果应该是:1AB3456789;

第13行,这里对pstring中的值进行了改写,那么它的操作和第11行是一样的,那么效果也应该是一样的,结果应该是1A23456789;

是这样吗?运行一下:



出错了!看一下出错的位置,第13行,为什么呢?它的操作和第11行是一样的啊,两者又都是字符串,怎么就不行了呢??

首先,我们要明白一件事情,string和pstring看上去是差不多,输出的结果也一样。但是,它们之间是有本质的差别的:char string[10]中的数据存放的位置是栈区,而pstring所指向''123456789"的区域是在常量区。这个错误的来源就是因为pstring所指向的常量区,因为常量区中,数据的特性是可访问,但不可更改!如我们程序中,就是可以对pstring指向的内容进行输出,但是你一旦对它进行了修改操作,那么编译器就会给你报错。所以,当出现了写入位置冲突这种错误的时候,先检查一下你到底是在操作哪个区域的数据?是否是常量区的。

这是第一个坑,编译器会告诉你,这样做是不行的。在讲述下一个坑之前,我们先把第13行屏蔽,看一下我们刚刚修改的猜想是否正确:

运行的结果和我们所猜测的是一样的。接下来我对程序进行一个小改动:

我将char string[10]改为了char string[9]。可能你会问,这样改有什么用?“123456789”,一共9个数,刚刚好存储的下,不存在越界,和刚刚的没区别啊。真的是这样么?看一下运行结果:

咋回事??后面那一串东西是咋蹦出来的?

为什么会有这情况呢?是因为在计算机中,一个字符串的结尾必须是'\0',也就是说,只有当计算机读到了‘\0’之后,它才会停止往下读。而数据存储在内存中,都是要占据空间的,所以'\0'也需要占据一个字节。我们一开始的时候,设置的字符串大小是10,我们在里面存储了1至9一共9个数(这里的数字是char型而不是int型),也就是说,我们还有一个空间可以拿来存储'\0',输出的时候完全没毛病。当我们改小之后,我们设定的数组的最后一位是'9',不是'\0',所以计算机认定字符串没有结束,就继续读接下来的内存数据,然后输出,直到遇到'\0'。或许你读到的后面的值和我的是不一样的,那很正常,因为我们用的不是一块内存,就算是同一块内存,每次运行时候的值都不一定相等,因为我们程序的内存地址是在不断变化的。

由以上例,记得在使用字符串的时候,不要忘了给'\0'留一个位置。


感谢阅读!

如有错误,欢迎指正!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值