是否可以分配緊鄰已分配記憶體的記憶體?
例如,
有一個指標指向分配的記憶體,如下所示:
int a = 10;
int* ptr = &a;
所以讓我們假設 &a 是 0x0000004 它的下一個地址根據它的資料型別將是 0x0000008。當我做
int* ptr2 = (ptr1 1);
ptr2 將指向 0x0000008 地址,但由于它是未分配的記憶體,我們不能使用它。有沒有辦法分配那個記憶體?我試過做。
int a = 10;
int* ptr = &a;
int* ptr2 = &(ptr[1]);
ptr2 = (int*) malloc(sizeof(int));
但顯然,這分配了一個新記憶體,而不是 0x0000008。我也嘗試過使用“new”關鍵字,但它與 malloc() 相同,因此效果不佳。
至于我想這樣做的原因或我想在哪里使用它。沒有具體原因。這只是一個想法,我想了解更多。
我正在使用 Windows 11 作業系統和 Visual Studio 2022 IDE。
uj5u.com熱心網友回復:
C 標準沒有提供任何在特定地址分配記憶體的方法。
“分配記憶體”只是安排記憶體不用于任何其他目的。為了提供分配服務,C 實作有一些關于如何使用記憶體的計劃。一些空間是為常量計劃的,一些是為靜態物件計劃的(在函式之外定義的變數static),一些是為自動物件計劃的,一些是為程式的指令計劃的,等等。地址空間的某些區域計劃用于malloc. 實作malloc和相關例程的庫軟體保留了該地址空間區域的哪些部分可用于分配的資料庫。當您呼叫 時malloc,他們會選擇該區域中的一些空間并更新該資料庫以指示該空間不再可用。
為了給您與現有變數相鄰的空間,C 實作必須有某種方式記錄該空間不可用于任何其他用途。它還必須確保該空間尚未用于其他用途。在典型的 C 實作中,根本沒有為此做出任何規定。除了動態分配之外,為事物規劃的所有空間部分都有自己的計劃如何使用它們,并且沒有規定要為動態分配劃出任何部分。
在特殊用途的環境中,可以撰寫一個 C 程式來管理它自己的部分或全部地址空間,或者作業系統或環境可以為此提供支持。即使在這種情況下,存盤器通常也是通過在系統設計和軟體構建期間而不是在程式執行期間做出的安排來管理的。
uj5u.com熱心網友回復:
您應該熟悉記憶體布局的概念以及哪些資料在哪里。您的int a變數將最終出現在初始化資料段中,而您嘗試訪問的動態資料malloc將進入堆,因此它們在記憶體中將具有不同的地址。(幸運的是,您可能會從初始化資料中訪問堆,尤其是在過去,甚至是堆疊段,這就是緩沖區溢位攻擊的作業方式,但現在有了各種隨機化和記憶體保護機制。)所以,TL;DR ,不,你不能。
uj5u.com熱心網友回復:
當你這樣做時(在一個函式中)
int a = 10;
int *ptr = &a;
你指的是“堆疊記憶體”。堆疊記憶體由編譯器管理,并在您宣告變數時“分配”。
int a = 10;
int b = 10;
int *ptr = &a;
假設&a等于 0x0000004。根據您的編譯器,&b實際上可能等于 0x0000008,這意味著ptr 1實際上可能已經“分配”了!不過,這是否屬實會因編譯器和平臺而異。我不會在實際代碼中依賴它,但玩起來很有趣。
如果要在堆疊上分配新記憶體,可以使用alloca,它有點像 malloc ,但用于堆疊記憶體。許多堆疊向下增長,因此您可以ptr - 1通過呼叫alloca(sizeof(int)).
uj5u.com熱心網友回復:
是否可以分配緊鄰已分配記憶體的記憶體?
答案是:沒有
C 標準中沒有任何內容描述變數如何放置在記憶體中。這完全取決于所使用的實作,因此您無法撰寫可移植的 C 代碼來控制變數在記憶體中的放置方式。
您可以撰寫自己的記憶體分配器,它可以讓用戶控制您的記憶體分配器擁有的記憶體中的分配,但它不能與具有自動/靜態存盤持續時間的變數一起使用,例如int a;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/516833.html
標籤:C指针动态内存分配
下一篇:C結構指標型別相同但仍然失敗
