忘记密码   免费注册 查看新帖 | 论坛精华区
ChinaUnix.net
  平台论坛 博客 微博 读书 人才 精华 文库 自测 | 频道操作系统 开发 数据库 存储 服务器 网络 IT新闻 Linux 下载 Power用户组
最近访问板块 发新帖
查看: 3754 | 回复: 20

字符数组会自动扩容么? [复制链接]
更多

Rank: 1

帖子
95
主题
2
精华
0
可用积分
237
专家积分
0
在线时间
13 小时
注册时间
2009-06-10
最后登录
2009-10-25
论坛徽章:
0
发表于 2009-07-02 18:26:09 |显示全部楼层
10可用积分
#include<stdio.h>
#include<string.h>
int main()
{
char a[4];
strcpy(a,"hello,world");
printf("%s\n",a);
printf("\n");
reuturn 0;
}
这个代码是可以运行的,而且会输出hello world,这是为什么呢?难道字符数组a会自动扩容?

最佳答案

aaaaa5aa 查看完整内容

程序并不知道数组只有 4 个元素, 因此它也不知道对 a[5] 的访问已经超出了数组的边界; 程序只是「盲目的」按照你的指示从 a + 5 的位置上取值, 至于这个位置是否合法它不关心, lz这样做已经造成溢出问题,下次多注意

帖子
5510
主题
452
精华
1
可用积分
28
专家积分
7
在线时间
628 小时
注册时间
2008-11-02
最后登录
2011-11-17
论坛徽章:
0
发表于 2009-07-02 18:26:10 |显示全部楼层
程序并不知道数组只有 4 个元素, 因此它也不知道对 a[5] 的访问已经超出了数组的边界; 程序只是「盲目的」按照你的指示从 a + 5 的位置上取值, 至于这个位置是否合法它不关心,
lz这样做已经造成溢出问题,下次多注意
一直在努力,一直在进步!!

帖子
11
主题
2
精华
0
可用积分
20
专家积分
0
在线时间
35 小时
注册时间
2009-01-18
最后登录
2011-09-22
论坛徽章:
0
发表于 2009-07-02 18:31:04 |显示全部楼层
楼主运气不是一般的差。
已经溢出了,不过问题还没有表现出来而已。
这种事,你应该庆幸程序运行异常,至少你知道错了,而不是认为C数组具有扩展能力。

帖子
2838
主题
668
精华
9
可用积分
41
专家积分
100
在线时间
1600 小时
注册时间
2008-08-15
最后登录
2011-12-01
论坛徽章:
0
发表于 2009-07-02 18:50:41 |显示全部楼层
If the destination string of a strcpy() is not large enough,  then  anything  might  happen.   Overflowing  fixed-length
       string  buffers is a favorite cracker technique for taking complete control of the machine.  Any time a program reads or
       copies data into a buffer, the program first needs to check that there’s enough space.  This may be unnecessary  if  you
       can  show  that  overflow  is  impossible, but be careful: programs can get changed over time, in ways that may make the
       impossible possible.
http://ubuntuer.cublog.cn欢迎做做

帖子
29
主题
9
精华
0
可用积分
31
专家积分
0
在线时间
14 小时
注册时间
2005-12-11
最后登录
2009-07-29
论坛徽章:
0
发表于 2009-07-02 18:56:42 |显示全部楼层
char a[4];是局部变量,编译器通常会在栈上分配大于这个大小的内存空间,所以即使你溢出了但也不至于出错,但是你要知道已经发生溢出了,如果溢出的部分有变量被覆盖的话,那你就能看到效果了~
渔夫

Rank: 3Rank: 3

帖子
3958
主题
47
精华
1
可用积分
2136
专家积分
75
在线时间
1074 小时
注册时间
2006-03-29
最后登录
2012-02-01
论坛徽章:
0
发表于 2009-07-02 19:19:44 |显示全部楼层
字符串在弄长点儿看看
虽千万人吾往矣……
修炼python中……
nnd,要失业了……

帖子
139
主题
39
精华
0
可用积分
142
专家积分
0
在线时间
43 小时
注册时间
2005-11-06
最后登录
2012-02-03
论坛徽章:
0
发表于 2009-07-02 20:19:39 |显示全部楼层
多定义几个局部变量就看到区别了,楼主纯属运气好,才会得到正确的结果

帖子
5510
主题
452
精华
1
可用积分
28
专家积分
7
在线时间
628 小时
注册时间
2008-11-02
最后登录
2011-11-17
论坛徽章:
0
发表于 2009-07-02 20:51:43 |显示全部楼层

回复 #7 cj_gameboy 的帖子

嗯,也许就不小心牵涉到别的程序了
一直在努力,一直在进步!!

Rank: 3Rank: 3

帖子
1170
主题
3
精华
0
可用积分
2551
专家积分
20
在线时间
239 小时
注册时间
2006-01-06
最后登录
2010-11-16
论坛徽章:
0
发表于 2009-07-02 21:07:37 |显示全部楼层
别人数组家外面都有栅栏,就C数组家没有,只是在该装栅栏的地上画了一条线。
你要跑出去,也没人拦你。跑出去了,要看你运气。如果是在美利坚合众国,你可能会被邻居一枪两个洞。或许正好碰到他心情好,就把你拖去家里吃他烤的牛排了。
我的BLOG:http://blog.csdn.net/beepbug/

Rank: 1

帖子
452
主题
7
精华
0
可用积分
589
专家积分
10
在线时间
126 小时
注册时间
2008-12-19
最后登录
2010-06-30
论坛徽章:
0
发表于 2009-07-02 21:43:10 |显示全部楼层
我在VC8下运行,程序崩溃了。
您需要登录后才可以回帖 登录 | 注册

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP