gpt4 book ai didi

c - 当我试图使数组溢出时 gcc 做了什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:35:10 26 4
gpt4 key购买 nike

我尝试了一段导致数组溢出的代码,但是当我用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

所以在代码中,我没有改变size的值,但是运行的时候,它确实自己变了!那么谁能告诉我为什么会这样?

PS:gcc版本为4.8.0

根据@NPE 的回答,我检查了 size 的地址,它实际上位于 a 之后的内存中。

但是当我添加一段代码的时候

printf("%X\n", &size);

之前

printf("%d, %X\n", size, &a);

结果是

BFC39108
4, BFC3910C
4, BFC3910C
4, BFC3910C
4, BFC3910C
0, 2, 4, 7, 4, 78, 65

此时,size 在内存中位于a 之前。


事实上,无论我在哪里打印size 的地址,它都恰好位于a 的地址之前;如果我不打印 size 的地址,它就位于 a 的地址之后。那么它仍然是编译器的未定义行为吗?

最佳答案

因为你写过了a的末尾,你的程序有undefined behaviour .这意味着它可以按照自己喜欢的方式行事,包括您观察的方式。

实际发生的情况是 size 恰好位于内存中 a 之后,以及以下越界赋值:

a[4] = 6;

覆盖大小

请注意,如果您使用不同的编译器或不同的编译器设置,或者对程序进行看似无关紧要的更改,代码可能会以其他方式失败。或者它可能在您的整个测试过程中运行良好,然后在您的客户面前爆炸。

关于c - 当我试图使数组溢出时 gcc 做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15835708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com