计算机系统基础----特殊类型(数组,结构体 ,联合体)的分配

发布时间 2023-05-05 22:34:21作者: 次林梦叶

《数组》

  《数组的分配与访问》

  首先我们要知道在8086中内存的结构如图:

   可见一个单元格有8bit(1B)

   对于指针类型数据占4字节,char占1个字节,int 占 4个字节,short 占2个字节,double 占8个字节

   当我们访问数组中的数据时是要访存的,当要访存时,我们只知道数组的首地址和数据下标i

 

  那么我们如何寻找在内存中我们所需要的数据呢?

  如图所示,这里我想要强调的是:

  假设一个int 型的数组,知道首地址为0100H ,那么 [1] 中的数据在哪个地址?

  0100H + 1 * 4(注意要转化为16进制) = 0104H

 

  《在静态区中的分配》

 

 因为buf数组定义在外面,则在编译后其在数据段中,而不在堆栈

通过反汇编可以知道buf 在数据段中的地址:08048908

其后为数组中的数据:

因为int 占 4B 即 32位,则可以知道 0A 00 00 00 为 10的数据表示

因为一个内存中的单元格有8位(一个字节),所以这里8位8位地一个分开,

所以有 0A 00 00 00 这样

因为其是小端模式,则真正看的话是: 00 00 00 0A

    

 

    《在堆栈中的分配》

 

 

  《数组与指针的关系》

 定义int a[]

注意:我们平时中写代码中对指针 的+1 操作在编译过后会解释成 + 1* (指针指向的数据的大小)

如 int * ptr; ptr+=1

那么其实是: add $4,ptr

 

还有:

  我们在A[0],A[i].....等操作都是要访存的,用mov指令

  而*(xxx) 操作是要取地址,用lea指令

 

《多维数组与指针数组的关系》

 我们来分析一下:

  通过:

  我们可以看到其实二维数组中也是直接保存了数据

  再通过:

其实二维数组 int num[][] 中的第一维相当于 int * num[],即指针数组

 

这个时候会想:指针数组中岂不是每一个元素都指向一个数据的地址吗?

咋指针数组还可以指向一个数组呢?

 

对的,指针指向了数组中第一个元素的地址

然后其他的数据需要下标来确定,没有下标,指针还真就是只能指向一个数据的地址

这也就是为什么我们在定义二维数组时可以定义为 int arr[][n] ,而不能是 int arr[n][]

其中的n就是用来判断这个一个指针中指向的数组,到底有多少个元素