栈上创建的临时对象及其成员可以确定存储在栈上
但是如果在堆上面手动分配一个对象,那么这个对象的成员究竟存储在内存中的什么位置?
分别创建一个栈上分配的临时结构体对象和一个堆上手动分配的结构体对象,打印存储位置。
#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开始的较大地址是栈地址,而其它较小的地址时堆上的地址。
结果:
从结果可以看出堆分配的对象除了该对象的指针实在栈上,其所有成员的地址都是在堆上的。
因此在堆上分配了一个对象,则该对象的成员也是存储在堆中的。