理解内存连续问题


int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}
  1. 该段代码会无限循环打印hello world,而不是打印三次。
  2. 涉及到函数调用的栈桢结构细节(操作系统或计算机体系结构的教材应该会讲到)。
  3. 函数体内的局部变量存在栈上,且是连续压栈。在Linux进程的内存布局中,栈区在高地址空间,从高向低增长。变量i和arr在相邻地址,且i比arr的地址大,所以arr越界正好访问到i。当然,前提是i和arr元素同类型,否则那段代码仍是未决行为。
  4. 死循环的问题跟编译器分配内存和字节对齐有关。数组3个元素 加上一个变量i 。4个整数刚好能满足8字节对齐(改成7个整数也会死循环) 所以i的地址恰好跟着a2后面 导致死循环。。如果数组本身有4个元素 则这里不会出现死循环,因为编译器64位操作系统下 默认会进行8字节对齐 变量i的地址就不紧跟着数组后面了。
  5. 可以百度搜索“大端小端”;intel 使用的小端模式,数据字节的高低位与内存地址的高低位一致。栈中数据存放是【由高地址到地地址】,所以 压栈顺序为 i ->a[2]->a[1]->a[0],出栈顺序相反,a[3]取到的值为i。

你可能感兴趣的:(理解内存连续问题)