C语言内存模型与指针以及变量的关系

什么是虚拟内存

内存模型(内存分区)图

这里写图片描述
代码示例

#include <stdio.h>

int gdata1 = 10;//.data
int gdata2 = 0;//.bss
int gdata3;//.bss段进程运行时,操作系统为.bss初始化为0
static int gdata4 = 11;//.data
static int gdata5 = 0;//.bss
static int gdata6;//.bss
int main()
{
    char *p = “hello world”;//.rodata区
    *p = ‘a’;//崩溃,不可写
    int a = 12;//data
    int b = 0;//.bss
    int c;//随机值、无效值.bss
    static int d = 13;//.data
    static int e = 0;//.bss
    static int f;//.bss,初始化为0
    return 0;
}

1.我们一般编程所说的内存是虚拟内存。
我们编程提到的内存都是抽象的概念,是虚拟的内存,并不是实在的物理内存。物理内存就是我们看得到摸得着的内存条。而我们需要了解的就是虚拟内存。出了写驱动等级别的程序外,一般是不需要了解具体的内存的,操作系统会将虚拟内存转换成物理内存。
2.虚拟内存是进程所在的地址空间。
(1)虚拟内存是给每一个进程的一个内存空间。每一个进程都有一个虚拟内存空间,进程之间的虚拟内存是隔绝的,相互不能重叠。
(2)而虚拟内存的大小则是根据操作系统的位数来决定的,比如32位操作系统,则虚拟内存大小为2的32次方。这个通常叫做进程的地址空间。
(3)如果进程间需要通信,则需要通过进程间通信(IPC)来实现。这是虚拟内存的一个补充机制。
3.虚拟内存内存是线性的。
物理内存的实现,和具体的内存品牌公司的策略有关。实际的物理内存很多都不是线性排开的,但是通过内存机制,对外展示成线性的逻辑地址,即从0一直到最大地址。而这个逻辑的内存模型,则表现在系统中的虚拟内存则是在此基础上的进一步的抽象。不过,只要记住一点,虚拟内存是线性的。线性即表示在一条线上就可以表示所有的地址,而不需要通过几个层次结构来定位一个内存地址。

内存和指针的关系

内存模型与指针和变量的关系
(1)指针是一个类型,占用的字节数与操作系统的位数有关。而操作系统的位数,决定虚拟内存的大小。如果是32位,则虚拟内存地址就是2的32次方个字节;如果是64则虚拟内存地址就是2的64个字节。
(2)而这么大的地址,需要指针能够全部索引到。所以,指针的值必须能够表示这么多个数字,而在32位操作系统中,则指针的值需要能够表示2的32次方个数,那么需要的就是32位的内存,即4字节。所以在32位系统中,指针只要是4字节就够了。不管是什么类型的指针,都是4字节。而在64位系统中,需要64位的指针,即8字节的指针。这4字节或者8字节就是必需的大小。
(3)如果指针超过这个需要的值,纯粹是浪费,如果小于这个需要的值,则不能够所引到内存的后面的部分。这也是,32位操作系统支持的最大内存是4GB,多了指针无法索引到,也就无法操作大于4GB内存位置。
(4)然后,内存地址是什么?
内存地址,由上图可以看出,内存地址就是内存单元的编号而已。
最后,变量就是一定大小的内存块,而变量名就是一个符号,由编译器处理,然后将内存块映射到变量。因此对变量的操作其实就是对对应的内存块的操作。

参考http://www.cjjjs.com/paper/bcyy/624201503021288.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值