簡體   English   中英

為什么此指針包含存儲在堆中的地址?

[英]Why does this pointer contain an address stored on the heap?

這是我的代碼(在Mac OS上為g++編譯器):

/* initialize character arrays */
char a[2] = "a";
char b[2] = "b";

/* assigns to c the pointer to a read-only buffer containing 'c' */
char* c = "c"; // does this cause a memory leak?

/* allocate heap-memory for d */
char* d = new char[2];
strcpy(d, "d");

/* print addresses and values */
std::cout << (void*)a << ":" << a << '\n';
std::cout << (void*)b << ":" << b << '\n';
std::cout << (void*)c << ":" << c << '\n';
std::cout << (void*)d << ":" << d << '\n';

/* free memory */
delete d[];

在看到該程序的輸出之前,我希望abc在堆棧上包含地址,在堆上包含d地址。 但是,輸出看起來像這樣:

0x7fff5a5ea38e:a
0x7fff5a5ea38c:b
0x105616f7c:c
0x7fa01bc02690:d

由於堆棧指針從最高地址向下生長,而堆指針從最低地址向上生長,因此似乎abd存儲在堆棧上,而c存儲在堆上。 是這樣嗎

我的問題是,由於我沒有使用new關鍵字分配內存,為什么將c存儲在堆上有意義? 這是否意味着c初始化已造成內存泄漏? 既然我在堆上專門分配了內存,為什么將d存儲在堆棧上?

謝謝!

您對內存區域的猜測不是很准確。 ab確實存在於堆棧中,因為它們是數組。 但是, c是指向字符串文字的指針,該字符串存儲在二進制映像(既不是堆棧也不是堆)中的.rodata節中。 d的值比ab小380 GB(!); 它在堆上(這是一個單獨的內存區域,盡管不在任何“最低地址”處)。

請記住,除了是與語言無關的特定於平台的細節之外,諸如ASLR之類的東西也使這種觀眾運動變得困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM