x64与x86中的内存处理 - C语言

Abd*_*ram 0 c memory 64-bit x86 x86-64

当我在X64计算机上使用GCC编译器运行下面的代码时,输​​出i为90,但在x86上运行时,其值仍为2,那么处理内存的区别在哪里?

#include <stdio.h>

int main(void)
{
  int arr[3]={50,7,30};
  int i=2;

  arr[3]=90;     
  printf("arr[2]=%d,arr[3]=%d,i=%d", arr[2], arr[3], i);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 5

C中的数组索引从0开始,因此有效索引为arr0,1和2.使用arr[3]是写出数组的末尾.这样做会调用未定义的行为,在您的情况下,该行为在x86和x64上表现为不同的行为.如果使用不同的编译器或更改优化设置,您可能也会得到不同的行为.

关于这种特定的行为,你似乎认为i应该arr在内存之后立即出现,以便写入arr[3]实际写入i.但是,无法保证范围内的局部变量的排序.它不仅仅是一个x86/x64的东西.

不要读/写超过数组的末尾,你不会看到这些类型的问题.