簡體   English   中英

為什么來自 malloc 的 *P 返回地址?

[英]why the *P from malloc return an adress?

我試圖理解為什么 *ptr 返回一個地址以及當我嘗試指向該地址的指針時。 代碼不起作用? 我想知道那個地址是什么意思,或者它只是堆里的一些垃圾?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* ptr = (int*)malloc(sizeof(int));
    printf("%d %d\n", *ptr, ptr);
}

這就是它所顯示的:1315264432 1315247120

%d是錯誤的int*格式說明符(事實上,根本沒有正確的int*格式說明符)。 如果您對錯誤類型使用格式說明符,則程序的行為是未定義的。

分配的 memory 未初始化。 那里沒有任何 object,並且嘗試訪問它,就好像有 object 一樣會導致未定義的行為。

未定義的行為解釋了您可以(並且需要)從語言的角度觀察到的有關行為的所有信息。

嘗試這個:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* ptr = (int*)malloc(sizeof(int));
    *ptr = 42; // Or any integer value you like
    printf("%d %08lx\n", *ptr, ptr);
}

首先,分配 memory,然后將其初始化為所需的任何值。

15.3 32位Memory尋址

  • 386、486 和 Pentium 處理器使用 32 位地址空間,能夠尋址 4 GB memory。
  • 這些處理器仍然能夠使用段寄存器,但 Windows 使它們保持固定,並使用 32 位平面尋址空間。
  • Windows 使用的 32 位地址不是物理地址。 應用程序使用虛擬地址。
  • 虛擬地址通過頁表轉換為物理地址。
  • 物理 memory 分為 4096 字節頁面。 每個頁面地址都以低 12 位為零的地址開始。
  • 每個進程都有自己的目錄頁,最多可包含 1024 個 32 位條目。 當前目錄頁的物理地址存儲在處理器的 CR3 寄存器中,當處理器在進程之間切換控制時會更改該寄存器。
  • 虛擬地址的結構:
  • 高10位:指定目錄頁中的1024項之一
  • 目錄條目的結構:
  • 高 20 位表示頁表的物理地址。 (底部 12 位為零。)這引用了另一個目錄頁,最多有 1024 個條目。
  • 中間 10 位:引用第二個目錄頁的 1024 條目之一。 該條目引用一個頁框,它是一個物理地址。
  • 底部 12 位:指定頁框內的物理 position。 d:目錄頁條目 p:頁表條目 o:偏移量 虛擬地址:dddd-dddd-ddpp-pppp-pppp-oooo-oooo-oooo CR3寄存器的內容:rrrr-rrrr-rrrr-rrrr-rrrr(20位) 進程當前目錄頁的起始物理地址:rrrr-rrrr-rrrr-rrrr-rrrr-0000-0000-0000(32位)第一次處理器訪問(目錄頁):rrrr-rrrr-rrrr-rrrr-rrrr-dddd -dddd-dd00 63 這個位置包含一個 20 位的表項:tttt-tttt-tttt-tttt-tttt 頁表的起始物理地址:tttt-tttt-tttt-tttt-tttt-0000-0000-0000 下一個處理器訪問(頁面入口):tttt-tttt-tttt-tttt-tttt-pppp-pppp-pp00 這個位置包含一個20位的頁框值:ffff-ffff-ffff-ffff-ffff 最后的32位物理地址:ffff-ffff -ffff-ffff-ffff-oooo-oooo-oooo

http://eik.bme.hu/~csurgai/Mswin_en/WinProg.pdf

指針值與虛擬地址相同

暫無
暫無

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

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