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太难找了。。,举个栗子:
#include <stdio.h>
#include <string.h>
int main()
{
long long over_space[10] = {9,8,7,6,5,4,3,2,1,0};
long long a[10] = {0};
for (int i = 0; i < 20; ++i) {
printf("%lld ", a[i]);
}
printf("\n");
long long copydata[20];
for (int i = 0; i < 20; ++i) {
copydata[i] = i + 100;
}
long long *p = a;
memcpy(p, copydata, 20*sizeof(long long));
for (int i = 0; i < 20; ++i) {
printf("%lld ", a[i]);
}
printf("\n");
return 0;
}
复制代码
在我的电脑上输出结果是:
0 0 0 0 0 0 0 0 0 0 9 8 7 6 5 4 3 2 1 0
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