簡體   English   中英

更改存儲值后修改 malloc 大小?

[英]malloc size modified after changing stored value?

我有一個程序使用 malloc 為我的程序分配一個 void 類型的空間,我傳遞給 malloc 的值是 1,所以它應該分配 1 個字節。

現在我將指針轉換為 int 並將其值修改為 int(例如 280)。 我很確定一個 int 需要存儲 memory 的 4 個字節,而且我知道 280 至少由 2 個字節表示

我的期望是,因為我只有一個 1 字節大小的指針,整個 integer 不適合那個空間,我認為會有錯誤或其他東西(沒有)然后我認為 integer 被存儲到RAM 從指針開始並超過分配的 memory,因為我將打印分配的指針 memory

我應該得到一個代表數字的整個第一個字節的值(在這種情況下:24)

但:

當我嘗試打印指針的值時,該值仍然是 280

現在我在想的是程序以某種方式自動為該指針分配更多大小

但我也覺得這很奇怪,誰能解釋一下這里發生了什么?

我還想知道如何只存儲 280 的第一個字節。

#include <iostream>

int main() {
  void* p = malloc(1); // This should allocate 1 byte
  *(int*)p = 280; // This should cast p to an integer, dereference it and set value to 280
  std::cout << *(int*)p << std::endl; // This prints 280 but I think it should print 24
  free(p);
}

上面是一個偽代碼,它應該做我做的 class 所做的事情,而不是發送整個 class 我只是將構造函數,運算符=,析構函數替換為它們的實際代碼

編輯

我正在使用 mingw32-g++ 來編譯應用程序

gcc 版本 6.3.0 (MinGW.org GCC-6.3.0-1)

Malloc 只分配一個字節,但沒有機制來避免您在其他 memory 地址上寫入,通過在 p 的地址中寫入 4 個字節,您寫入分配的字節 + 3 個其他連續字節。 之后,當您引用指針時,您會讀取 4 個與您剛剛寫入的字節相同的字節。 您正在做的是在程序可能未使用的 memory 上寫入和讀取,但這是未定義的行為,您永遠不應該這樣做,因為它會導致分段錯誤。

暫無
暫無

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

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