堆栈分配对象的成员存储位置

栈上创建的临时对象及其成员可以确定存储在栈上

但是如果在堆上面手动分配一个对象,那么这个对象的成员究竟存储在内存中的什么位置?


分别创建一个栈上分配的临时结构体对象和一个堆上手动分配的结构体对象,打印存储位置。

#include <stdio.h>
#include <stdlib.h>

typedef struct _MemInfo {
    int value;
    int *ptr;
    char sarry[100];
    char *parry;
}MemInfo;

void printmem(MemInfo *pmem)
{
    printf("&pmem = %p,\t pmem = %p \
            \n&value = %p \
            \n&ptr = %p,\t ptr = %p \
            \n&sarry = %p,\t sarry = %p \
            \n&parry = %p,\t parry = %p \n",       
            &pmem, pmem, &(pmem->value), &(pmem->ptr), pmem->ptr, &(pmem->sarry), pmem->sarry, &(pmem->parry), pmem->parry);
}

int main()
{
    printf("\n==================栈分配MemInfo======================start\n");
    MemInfo meminfo;
    meminfo.ptr = new int;
    meminfo.parry = new char [100];
    printmem(&meminfo);
    delete meminfo.ptr;
    delete [] meminfo.parry;
    printf("==================栈分配MemInfo======================over\n");
    printf("\n==================堆分配MemInfo======================start\n");
    MemInfo *pmem = new MemInfo;
    pmem->ptr = new int;
    pmem->parry = new char[100];
    printmem(pmem);
    delete pmem->ptr;
    delete [] pmem->parry;
    delete pmem;
    printf("==================堆分配MemInfo======================over\n");
}


linux上内存结构从低到高分别是:代码段、数据段、BSS段、堆、栈。上图可以看出0x7ff开始的较大地址是栈地址,而其它较小的地址时堆上的地址。




结果:


从结果可以看出堆分配的对象除了该对象的指针实在栈上,其所有成员的地址都是在堆上的。

因此在堆上分配了一个对象,则该对象的成员也是存储在堆中的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值