搜索
编程论坛
→
开发语言
→
『 C语言论坛 』
→ 输出加过为什么是8?而不是3?
标题:
输出加过为什么是8?而不是3?
只看楼主
abc594986308
等 级:
论坛游侠
帖 子:168
专家分:116
注 册:2013-3-18
第
11
楼
得分:0
回复 10楼 hjx1120
那它怎么输出的是8啊?
2015-07-22 16:03
TonyDeng
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
12
楼
得分: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
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
13
楼
得分:0
这种现象,就是常说的“越界访问”、“溢出”,是运行时崩溃的主因。C语言本身没有字符串这种数据类型,它以'\0'字符为结束标志作为“字符串”的约定处理法则,用这种处理法则使用的字符数组,叫cz串,也叫“C风格字符串”。
以下是《C++ Primer》书中的一段话:
尽管C++支持C风格字符串,但在C++程序中最好还是不要使用它们。这是因为C风格字符串不仅使用起来不太方便,而且极易引发程序漏洞,是诸多安全问题的根本原因。
授人以渔,不授人以鱼。
2015-07-22 16:31
TonyDeng
等 级:
贵宾
威 望:
304
帖 子:25859
专家分:48889
注 册:2011-6-22
第
14
楼
得分:0
越界访问,有读、写两种情形。一般来说,如果是访问的区域有读取权,是没有问题的,那顶多是泄密,信息遭到窃取;如果是没有读取权的,系统会拦截。写就危险了一些,它会修改或覆盖不该被修改、覆盖的数据,如果访问的区域是代码区,那么就是把程序代码破坏了。
C把安全问题抛给程序员(这是C语言设计的前提,开创者是这样解释的,也是它速度快的主因),凡是学C的,首先必须知道这个大前提,要知道怎么用、该做什么、不该做什么。C++和各种高级程序设计语言,没有这种前提,它们大多把维持安全性放在首位,主动检测这些问题,故执行代码没有C快——其实写C程序,把该做的做了,速度也就跟人家的差不多,没必要神化C。
授人以渔,不授人以鱼。
2015-07-22 16:55
yx1998
等 级:
论坛游民
威 望:
1
帖 子:30
专家分:35
注 册:2015-7-24
第
15
楼
得分:0
strlen是一个字符串处理函数,具体实现我不知道,但是你的数组没有'\0'不会被视为字符串
静心学习,远离浮躁。
2015-07-24 22:19
yx1998
等 级:
论坛游民
威 望:
1
帖 子:30
专家分:35
注 册:2015-7-24
第
16
楼
得分:0
至于为什么是8,在每个人的pc上都是不一样的,我认为取决于距离他内存最近的一个空字符
静心学习,远离浮躁。
2015-07-24 22:21
qq576688920
等 级:
新手上路
帖 子:13
专家分:2
注 册:2015-7-25
第
17
楼
得分:0
strlen求一个字符串的长度,如果你写的是
char * name2 = "rai";
得出来的就是正确的3,
char name2[]={'r','a','i'};
int sl=strlen(name2);
你这个数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。就不知道数组的大小。所以和你的想象不一样。。。
================================================
PS:其实我是一本正经的胡说八道,我才自学C语言了,一个星期。 0.0
2015-07-25 11:18
17
2/2页
1
2
参与讨论请移步原网站贴子:
https://bbs.bccn.net/thread-455640-1-1.html
关于我们
|
广告合作
|
编程中国
|
清除Cookies
|
TOP
|
手机版
编程中国
版权所有,并保留所有权利。
Powered by
Discuz
, Processed in 0.021538 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved