c程序地址空间

我们都知道指针在计算机中占有很重要的部分,但指针究竟是什么呢?有人说:指针就是地址,因为指针都是指向一个地址空间的,。这么说也没毛病,但不准确。
例如: int a=10; int * p=a; 很显然指针变量p中所存的是&a,不过这只是指针变量的一部分,是指针变量作为左值的表现,还有指针变量作为右值的呢,那么p表示的就是指针内容了。
不过在地址空间中也有不同的区域,请看下图:

地址空间

这里重点介绍一下堆区和栈区。
堆和栈是相对而生的,如图所示,栈向下,堆向上。也就是说,存储时,如果在栈中,那么地址是由高到低存的,在堆中,那么地址是由低到高存的,要是不信,请看下面的代码:

#include<stdio.h>
#include<stdlib.h>
int g_val=10;
static int gs_val=20;
int main()
{
    int a,b,c;
    int arr[100];
    char*msg="hello bit";
    char str[]="hello bit";
    int*adr=(int*)malloc (10*sizeof(int));
    int*adr1=(int*)malloc (10*sizeof(int));
    printf("code:%p\n",main);
    //printf("static global val:%p,%p\n"&g_val,&gs_val);

    printf("heap:%p~%p\n",adr,adr+9);
    printf("heap:%p~%p\n",adr1,adr1+9);

    printf("stack:%p,%p,%p\n",&a,&b,&c);

    printf("stack array:%p~%p\n",arr,&arr[99]);

    printf("msg:%p,&msg:%p\n",msg,&msg);

    printf("%c->%p\n",str[0],str);
    printf("%c->%p\n",str[9],&str[9]);
    free(adr);
    free(adr1);
    return 0;
}

下面请看结果:

结果

我们来看一下,heap表示的是堆区,在堆区中的分别是:002F1B98~002F1BBC和002F1BF0~002F1C14,可以看出两个都是由低到高的,;同样的,来看在栈中的a,b,c地址就是由高到低的,这就堆和栈的相对性,接下来看array,我们发现在栈所分配的数组中还是由低到高的,可以看出,分配地址时,是先给整个数组分配,再在数组中分配。
最后再说一点,地址空间和物理内存完全不一样。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值