【技术研究】数组,内存空间

TEC

Posted by Corax on November 5, 2023

常量求值 在编译前

数组

每个元素不考虑对其,也不重叠存放

存放有连续性,一致性。

image-20231106195732824

int ary[5] = {1, 2, 3, 4, 5};

ary 第零个元素的地址常量(常量也就意味着不想变量一样可以自增自减)

ary[n] address: 必须一个是整型,一个是地址类型

​ (int)ary + sizeof(type)*n

image-20231106195955813

ary[n] address:

​ (int)ary + sizeof(type)*n

上面这个和ary[n]汇编代码一模一样,可以看到反汇编代码完全一致。

image-20231106202818113

关于一些脑洞

image-20231106202454039

如果想在现在ary初始19ff18情况下 访问0x400000

就需要400000-19ff18=13E498h=622650

image-20231106204927529

image-20231106204935725

image-20231106204941281

由此,数组下表运算也可以获取内存中的任意点了。

有一个蛮有意思的问题

因为ary是一个常量,而内存结构当中,不能直接写入的只有代码区和data的只读区

image-20231106205552328

本来ary是不能自增的,但如果有一个函数image-20231106205642018

那么他就作为参数传递到了栈空间(只有ary’首地址传递) ,就可以自增了。

同理常量传给函数,在函数体内就以变量存在了。

一个简单示例

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
using namespace std;

void exchange(int n, int m)
{
    int temp = n;
    n = m;
    m = temp;
}

int main(int argc, char* argv[])
{
	int n = 2;
    int m = 3;
    exchange(n, m);
    

    system("pause");
	return 0;
}

让我们在内存里面看一下这个形参和实参

执行完这两步之后,在栈申请的空间里面做了赋值

image-20231106211804281

然后准备调用函数

先做函数传递 返回地址 和栈底保存

image-20231106211846426

image-20231106211913920

然后运行第一条,之后把所指位置作为Temp赋值为2

image-20231106211952369

在执行两条

image-20231106212011029

直接在传递的参数这里做文章。

这就是形参和实参

要改变实参

  • []下表运算
  • *取内容
  • ->成员体指向符

下标运算优先级高于取地址

浅讲windows内存结构

image-20231106213152245

32位 x86处理器下,共4G大小

  • 最上面64KB用作空指针检查,访问必报错C05
  • 然后内核和用户空间有个数据交换区域,64KB,不给用户用
  • 下面高两G是内核空间,也不让用
  • 而剩下的用户区仍然有一些dll加载着
  • 我们的code,data,stack,heap就在剩余的空间里面