| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1162 人关注过本帖
标题:strcat问题出现.......
只看楼主 加入收藏
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
得分:0 
如果你的s[3]越界,碰巧s[3]后面的地址上又存有重要数据的话,后果可想而知啦

If you shed tears when you miss the sun, you also miss the stars.
2007-05-28 13:45
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
以下是引用weishj在2007-5-28 13:43:21的发言:

这就是越界导致程序崩溃的一个实例啦
拿上面一个例子说明一下,
#include<stdio.h>
#include <string.h>
main()
{
char s[4][4]={"aef","gasw","haha"};


puts(s[0]);puts(s[1]);puts(s[2]);
}
s[1]越界,其'\0'放在了s[2]的首地址,但在初始化s[2]时,s[1]放在s[2]首地址中的'\0'被'h'覆盖掉了,所以这时s[1]在输出时要继续寻找'\0',刚好找到s[2]的结尾,有个'\0',这时输出的s[1]就是gaswhaha了.

谢谢哈  但我还是不明白 既然它是一个4*4的数组 就应该已经给它分配了内存空间啊?你说的前面的我不说什么 但输出haha后怎么能找到
'\0'呢 系统不应该会给它再分配空间来存储'\0'吧  是不是由于在内存中空闲的空间都是用0来标识呢????


希望一心想学c的加我的群吧~~ 40834003
2007-05-28 15:37
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
得分:0 
因为在初始化时,s[2]被赋了"haha",系统默认的给每一个字符串后加了个'\0',虽然s[2]依然越界,但这个'\0'被放在s[3]的起始地址了,所以能读出来的
内存的空闲空间不一定是0标识的,而是不确定值

[此贴子已经被作者于2007-5-28 16:57:53编辑过]


If you shed tears when you miss the sun, you also miss the stars.
2007-05-28 16:57
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
以下是引用weishj在2007-5-28 16:57:22的发言:
因为在初始化时,s[2]被赋了"haha",系统默认的给每一个字符串后加了个'\0',虽然s[2]依然越界,但这个'\0'被放在s[3]的起始地址了,所以能读出来的
内存的空闲空间不一定是0标识的,而是不确定值
内存的空闲空间不一定是0标识的,而是不确定值

这样说就是有可能当haha输出完后就有可能会继续输出一些字符(这些字符是不确定的字符) 而不是在输出haha后就遇到'\0'而结束

希望一心想学c的加我的群吧~~ 40834003
2007-05-28 18:18
weishj
Rank: 1
等 级:新手上路
威 望:2
帖 子:141
专家分:0
注 册:2007-4-22
收藏
得分:0 
怎么不是呢
由于s[2]越界,s[3]的首地址被放了'\0'.
用puts(s[1])输出时,系统顺序按内存地址读取信息输出,直到读到结束符(即'\0')时该输出结束;所以puts(s[1])一直输出到到s[3]的首地址的内容才结束,故输出gaswhaha
而puts(s[2])也同样顺序找到s[3]首地址那个'\0'时结束输出,故输出haha
要知道'\0'是字符数组的一个结束标志,而puts函数输出时也是以'\0'作为结束标志的
比如下面的程序只输出asdfd,后面的dfdf根本不会输出
main()
{
char n[22]="asdfd\0dfdf";
puts(n);
getch();
}

[此贴子已经被作者于2007-5-28 18:37:18编辑过]


If you shed tears when you miss the sun, you also miss the stars.
2007-05-28 18:30
小子也大叔
Rank: 2
等 级:新手上路
威 望:4
帖 子:143
专家分:0
注 册:2007-4-23
收藏
得分:0 
以下是引用weishj在2007-5-28 18:30:33的发言:
怎么不是呢
由于s[2]越界,s[3]的首地址被放了'\0'.
用puts(s[1])输出时,系统顺序按内存地址读取信息输出,直到读到结束符(即'\0')时该输出结束;所以puts(s[1])一直输出到到s[3]的首地址的内容才结束,故输出gaswhaha
而puts(s[2])也同样顺序找到s[3]首地址那个'\0'时结束输出,故输出haha
要知道'\0'是字符数组的一个结束标志,而puts函数输出时也是以'\0'作为结束标志的
比如下面的程序只输出asdfd,后面的dfdf根本不会输出
main()
{
char n[22]="asdfd\0dfdf";
puts(n);
getch();
}

哦 上面我出了点错 我都忘了 是一个4*4的数组 忘了还有个s[3]。

要知道'\0'是字符数组的一个结束标志,而puts函数输出时也是以'\0'作为结束标志的???
puts函数输出时也是以'\0'作为结束标志的--是由于字符串是以'\0'结束的吧 而它又是用来输出字符串的 肯定就是当遇到'\0'就结束咯

呵呵~~~~~~~


希望一心想学c的加我的群吧~~ 40834003
2007-05-28 22:00
快速回复:strcat问题出现.......
数据加载中...
 
   



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

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