Chinaunix

标题: printf和memcpy如果超过范围会怎么样 [打印本页]

作者: 进无止进    时间: 2016-11-25 00:16
标题: printf和memcpy如果超过范围会怎么样
如题,假如我调用printf 打印一个整型数组,数组长度10;利用for循环逐个打印数组的元素,但是i的值一直累计到20,此时应该是内存越界了,会提示段错误。但是我只是调用printf将其元素打印出来而已,为什么会这样?


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

作者: ljmmail    时间: 2016-11-26 09:00
很简单,C语言中声明数据长度、范围,就是你向编译器申请了属于自己的私有空间大小,你当然可以出入自家的房子,但是跑到别人家的房子中,系统当然会报错误了。
作者: meamin    时间: 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]








欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2