免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2432 | 回复: 2
打印 上一主题 下一主题

[C] printf和memcpy如果超过范围会怎么样 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-25 00:16 |只看该作者 |倒序浏览
如题,假如我调用printf 打印一个整型数组,数组长度10;利用for循环逐个打印数组的元素,但是i的值一直累计到20,此时应该是内存越界了,会提示段错误。但是我只是调用printf将其元素打印出来而已,为什么会这样?


同样的,假如我利用memcpy给一个长度为20的整型数组拷贝内存,但是我长度字段设置为40,这里的情况跟上一种是同样的错误类型吗?

论坛徽章:
0
2 [报告]
发表于 2016-11-26 09:00 |只看该作者
很简单,C语言中声明数据长度、范围,就是你向编译器申请了属于自己的私有空间大小,你当然可以出入自家的房子,但是跑到别人家的房子中,系统当然会报错误了。

论坛徽章:
0
3 [报告]
发表于 2016-12-02 00:08 |只看该作者
本帖最后由 meamin 于 2016-12-02 00:47 编辑

这会出现未定义行为。当溢出的内存合法时,程序会继续运行,这样的bug太难找了。。,举个栗子:
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main()
  4. {
  5.   long long over_space[10] = {9,8,7,6,5,4,3,2,1,0};
  6.   long long a[10] = {0};
  7.   for (int i = 0; i < 20; ++i) {
  8.     printf("%lld ", a[i]);
  9.   }
  10.   printf("\n");
  11.   long long copydata[20];
  12.   for (int i = 0; i < 20; ++i) {
  13.     copydata[i] = i + 100;
  14.   }
  15.   long long *p = a;
  16.   memcpy(p, copydata, 20*sizeof(long long));
  17.   for (int i = 0; i < 20; ++i) {
  18.     printf("%lld ", a[i]);
  19.   }
  20.   printf("\n");
  21.   return 0;
  22. }
复制代码

在我的电脑上输出结果是:
  1. 0 0 0 0 0 0 0 0 0 0 9 8 7 6 5 4 3 2 1 0
  2. 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
复制代码

over_space和a是在栈空间的,大概像这样(地址是从大到小,栈顶地址是最大的)
over_space[9]
over_space[8]
...
over_space[0]
a[9]
a[8]
...
a[0]



您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP