通过尝试访问大于其在 C 中的维数的位置来访问数组后的变量

Accessing variable after an array by trying to access a position greater than its dimension in C

因为在这个例子中,由于指针算法,我能够读取 integer2 的值:

#include <stdio.h>

    int main() {
      int integer1 = 1;
      int integer2 = 2;
      int *p = &integer1;
      p++;
      printf("%d\n", *p);
    } 

输出:

$ ./test
2

我想知道为什么在这个例子中:

#include <stdio.h>

int main()
{
  int array[2] = {0, 1};
  int variable = 0;
  for(int i = 0; i < 3; i++) {
    printf("%d\n", array[i]);
  }
}

然后我无法读取试图指向下一个整数的变量的值,但这就是我得到的:

0
1
336859392

我尝试打印 &array[0] &array[1] 和 &variable 的值,这就是我得到的:

161695488
161695492
161695480

不仅变量的地址小于数组的第一个元素,甚至连前一个都不如
为什么在第一个示例中变量地址是连续的而在第二个示例中不是?
关于变量和缓冲区在堆栈中的分配方式,我可能有些不明白。

编辑: 我知道不应该这样做,但我正在尝试了解缓冲区溢出(更现实地说,缓冲区应该是字符,由用户输入),目标应该是改变变量的值。所以我想了解的是,是否有可能确切知道变量在内存中的实际位置。

编辑2: 事实证明,提供 -fno-stack-protector 可以使其按预期工作,因此 gcc 默认添加某种保护以避免缓冲区溢出

局部变量的放置是实现的一个细节。它们可以按照它认为合适的任何顺序放置。

尝试越过数组边界读取会调用 undefined behavior。您看到的不一致结果就是这种情况的表现。

例如,如果我 运行 你的第一个代码片段,我 不会 得到 2 作为输出。打印每个变量的地址时,我得到:

&integer1=0x7ffcfa6e8c24, &integer2=0x7ffcfa6e8c20

因此在我的例子中,实现将 integer1 放在 integer2.

之后