| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 767 人关注过本帖
标题:输出加过为什么是8?而不是3?
只看楼主 加入收藏
abc594986308
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
收藏
得分:0 
回复 10楼 hjx1120
那它怎么输出的是8啊?
2015-07-22 16:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C的“字符串”是搜寻字符数组中的'\0',以此作为结束符,它会一直找下去。strlen(name2)函数调用,就从name2的入口开始一直找,它扫过'r'、'a'、'i'之后,没有找到'\0',就会越界进入后面的内存区域,恰好C的栈数据区分配,是逆向增长的,也就是说,栈的数据,name1位于name2的后面(这与你定义的顺序有关,自己变化一下琢磨),那么这个越界动作正好进入name1的入口,它一直找下去,把name1也扫了一遍,总算给找到'\0'了,这时,它的计数器已是8,就把name2的长度当作8返回。我让你在中间插入一个字符串(它的长度是10,此时因为已找到'\0',就不会继续向name1处去),就证明这个道理。你也可以在中间插入别的数据,比如一个int、double等等。

注意:解答虽然是这样,但这种数据分配的规律不是“必然如此”的,写程序千万不要依赖这种副作用!不要特意写这样的代码。

授人以渔,不授人以鱼。
2015-07-22 16:22
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
这种现象,就是常说的“越界访问”、“溢出”,是运行时崩溃的主因。C语言本身没有字符串这种数据类型,它以'\0'字符为结束标志作为“字符串”的约定处理法则,用这种处理法则使用的字符数组,叫cz串,也叫“C风格字符串”。

以下是《C++ Primer》书中的一段话:
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。

授人以渔,不授人以鱼。
2015-07-22 16:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
越界访问,有读、写两种情形。一般来说,如果是访问的区域有读取权,是没有问题的,那顶多是泄密,信息遭到窃取;如果是没有读取权的,系统会拦截。写就危险了一些,它会修改或覆盖不该被修改、覆盖的数据,如果访问的区域是代码区,那么就是把程序代码破坏了。

C把安全问题抛给程序员(这是C语言设计的前提,开创者是这样解释的,也是它速度快的主因),凡是学C的,首先必须知道这个大前提,要知道怎么用、该做什么、不该做什么。C++和各种高级程序设计语言,没有这种前提,它们大多把维持安全性放在首位,主动检测这些问题,故执行代码没有C快——其实写C程序,把该做的做了,速度也就跟人家的差不多,没必要神化C。

授人以渔,不授人以鱼。
2015-07-22 16:55
yx1998
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:35
注 册:2015-7-24
收藏
得分:0 
strlen是一个字符串处理函数,具体实现我不知道,但是你的数组没有'\0'不会被视为字符串

静心学习,远离浮躁。
2015-07-24 22:19
yx1998
Rank: 2
等 级:论坛游民
威 望:1
帖 子:30
专家分:35
注 册:2015-7-24
收藏
得分:0 
至于为什么是8,在每个人的pc上都是不一样的,我认为取决于距离他内存最近的一个空字符

静心学习,远离浮躁。
2015-07-24 22:21
qq576688920
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2015-7-25
收藏
得分:0 
strlen求一个字符串的长度,如果你写的是
   char * name2 = "rai";
得出来的就是正确的3,
   char name2[]={'r','a','i'};
int sl=strlen(name2);
   你这个数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。就不知道数组的大小。所以和你的想象不一样。。。
  
================================================
PS:其实我是一本正经的胡说八道,我才自学C语言了,一个星期。  0.0
2015-07-25 11:18
快速回复:输出加过为什么是8?而不是3?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038563 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved