棧上創建的臨時對象及其成員可以確定存儲在棧上
但是如果在堆上面手動分配一個對象,那麼這個對象的成員究竟存儲在內存中的什麼位置?
分別創建一個棧上分配的臨時結構體對象和一個堆上手動分配的結構體對象,打印存儲位置。
#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開始的較大地址是棧地址,而其它較小的地址時堆上的地址。
結果:
從結果可以看出堆分配的對象除了該對象的指針實在棧上,其所有成員的地址都是在堆上的。
因此在堆上分配了一個對象,則該對象的成員也是存儲在堆中的。