我试过一段代码,它使得数组溢出,但是当我用gcc编译它时发生了意想不到的事情。下面是代码:当我尝试创建一个数组溢出时,gcc会完成什么?
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[] = {0,2,4,7};
int size = sizeof(a)/sizeof(int);
int i;
printf("%d, %X\n", size, &a);
a[4] = 6;
printf("%d, %X\n", size, &a);
a[5] = 78;
printf("%d, %X\n", size, &a);
a[6] = 65;
printf("%d, %X\n", size, &a);
for (i = 0; i < size; i++) {
printf("%d, ", a[i]);
}
printf("%d, %d, %d\n", a[size], a[size+1], a[size+2]);
printf("\n");
return 0;
}
,其结果是:
4, BFC4DDF8
6, BFC4DDF8
6, BFC4DDF8
6, BFC4DDF8
0, 2, 4, 7, 6, 5, 65, 0, 0
所以在代码中,我并没有改变大小的值,但是当它跑,它本身没有变化!那么谁能告诉我为什么会发生这种情况?
PS:gcc版本是4.8.0。
根据@NPE的回答,我检查了size
的地址,它实际上位于a
之后的内存中。
但当我之前
printf("%d, %X\n", size, &a);
添加一段代码
printf("%X\n", &size);
结果是
BFC39108
4, BFC3910C
4, BFC3910C
4, BFC3910C
4, BFC3910C
0, 2, 4, 7, 4, 78, 65
在这个时候,size
位于内存a
之前。
事实上,无论我打印size
的地址,它位于正好之前a
的地址;如果我不打印size
的地址,它就位于a
的地址之后。那么它仍然是编译器的未定义行为?
我预计大小的值不应该改变。 – Jude 2013-04-05 14:12:49
你不能再期待一旦你有未定义的行为。 – NPE 2013-04-05 14:14:14