64位位址強轉和解引用注意長度

2021-10-08 14:27:48 字數 1252 閱讀 7576

參考

base b;

printf("%p\n", (int*)*(int*)*(int*)(&b));

但是,這裡的**是在32位下的,如果是x64位就直接宕了

原因是x64位的位址是64位的,而x86下面是32位的。

// x86下面的位址

0034116d

003412ee

// x64下面列印的位址

00007ff664371447

00007ff66437108c

出問題的地方主要是強轉之後解引用發生的,在x64下面int指標還是64位的,強轉沒有問題。但是,如果(int*)之後就出問題了,拿到乙個int型別的整數,只有32位。而後面又去把它轉成int*的64位位址,高位用0xffffffff補全,結果就不對了。

0x00007ff6bb966841 處(位於 diffrent_address_study.exe 中)引發的異常: 0xc0000005: 讀取位置 0xffffffffbb96ad30 時發生訪問衝突。
開始以為把int換成long就行了,結果死翹翹,long也是4位。這個估計得看系統了,我得win10下面,x64下面的長度如下

sizeof(int) = 4

sizeof(long) = 4

sizeof(int*) = 8

sizeof(long*) = 8

sizeof(intptr_t) = 8

看定義

// definitions of common types

#ifdef _win64

typedef unsigned __int64 size_t;

typedef __int64 ptrdiff_t;

typedef __int64 intptr_t;

#else

typedef unsigned int size_t;

typedef int ptrdiff_t;

typedef int intptr_t;

#endif

還看到一些網友[1]的寫法,我覺得這個比較好,跳過了解引用運算子的操作,也就不會出現問題了。而且對於虛表也比較清晰

base b;

long** pvtab = (long**)&b;

[1]c++物件在64位機器上的記憶體布局

127 0 0 1和0 0 0 0位址的區別

ip位址由兩個部分組成,net id和host id,即網路號和主機號。net id 表示ip位址所在的網路號。host id 表示ip位址所在網路中的某個主機號碼。即 plain view plain copy ip address 特殊ip位址就是用來做一些特殊的事情。rfc1700中定義了以下...

MAC位址轉換 64位整型轉string

實際程式設計中,mac位址多用整型來表示,如unsigned long long等。整型對於機器是友好的,對於編碼人員就不那麼友好了,畢竟我們還是喜歡用string型別的mac位址,如 00 00 00 00 00 00 下面就寫了個簡單的小方法,供參考 使用 include stdafx.h in...

IPv4位址和網路位址

小插曲 次方 次方是我們學習進製轉換的必備良藥,在這裡,我為數學不好的同學稍微科普一下次方的基本概念 次方最基本的定義是 設a為某數,n為正整數,a的n次方表示為a 表示n個a連乘所得之結果,如2 2 2 2 2 16。次方的定義還可以擴充套件到0次方和負數次方等等。乙個數的零次方 任何非零數的0次...