struct Test
{
int a;
int b;
int arr[1];
int c;
};
当定义Test t; t.arr[1] = 0;时, t.arr[1]将造成arr的访问越界, 实际是覆盖了t.c变量
arr+2, arr+3等, 肯定是覆盖了更高的地址部分; c地址比arr高。 因此c可能被覆盖。
void test_func()
{
int a;
int b;
int arr[1];
int c;
//do something..
...
arr[1] = 0;//arr[1]<del>访问已越界, 将覆盖b变量。。。 continue。 好像不是如此。 但肯定是不会覆盖c; 会覆盖高地址部分、即a或者b之类的, 因为栈是高向低增长。
}</del>
arr+2、arr+3也肯定是覆盖更高地址部分。 但c/c++栈是向低地址部分增长, 因此是覆盖b甚至覆盖a。。
a:140734632597980,
b:140734632597976.
&arr[0]:140734632597968,
&arr[1]:140734632597972,
实测看, &a < &b < &c ; 且&arr[0]不在&b, &c之间,,,,
解析C++结构体访问越界及内存覆盖问题
本文详细解析了C++中结构体访问越界导致的内存覆盖现象,具体分析了`t.arr[1]=0;`时如何覆盖`t.c`变量及其对后续变量的影响,并通过实例代码展示这一过程,旨在帮助开发者理解内存访问的安全性。
1069

被折叠的 条评论
为什么被折叠?



