马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kangels 于 2013-3-19 10:23 编辑 + x( R4 e' e3 h( {/ I
; Q6 I, a6 i3 x& T( j8 s7 |丢失的类型信息* i: P* m$ |& {1 E; x P: }3 d
猜测
' w4 \+ a2 P9 `# e指针变量应该存储两方面的信息:地址,类型信息' ?/ O& Q+ }7 [! |! k
/ }" M z" B; [- t1 a实证
7 d J9 T9 a% X$ p, |' O f$ }用sizeof(),float *,int*,double *....都是4字节没有存储类型信息只有地址信息
( x4 T! W9 Y/ y反汇编一段代码来看看5 T( {+ p1 L5 c* y& h+ \; M4 B
实例1:5 i9 F" C3 s6 a" n; P
#include <stdio.h> int gi; int * pi; void main(int argc, char **argv) { pi = &gi; *pi = 12; } 1: #include <stdio.h> 2: int gi; 3: int * pi; 4: void main(int argc, char **argv) 5: { 00411370 push ebp 00411371 mov ebp,esp 00411373 sub esp,0C0h 00411379 push ebx 0041137A push esi 0041137B push edi 0041137C lea edi,[ebp+FFFFFF40h] 00411382 mov ecx,30h 00411387 mov eax,0CCCCCCCCh 0041138C rep stos dword ptr es:[edi] 6: pi = &gi; 0041138E mov dword ptr ds:[00417140h],417144h 7: *pi = 12; 00411398 mov eax,dword ptr ds:[00417140h] 0041139D mov dword ptr [eax],0Ch 8: } 004113A3 xor eax,eax 004113A5 pop edi 004113A6 pop esi 004113A7 pop ebx 004113A8 mov esp,ebp 004113AA pop ebp 004113AB ret
& u# P ^' F. O* p* r+ C2 ^7 A9 j4 Z9 A$ `! o4 H! m# C* W
实例2:6 ]0 n& ?, d" h
#include <stdio.h> short gs; short * ps; void main(int argc, char **argv) { ps = &gs; *ps = 12; }
9 q* u& P0 Y$ S& E0 H. C 1: #include <stdio.h> 2: short gs; 3: short * ps; 4: void main(int argc, char **argv) 5: { 00411370 push ebp 00411371 mov ebp,esp 00411373 sub esp,0C0h 00411379 push ebx 0041137A push esi 0041137B push edi 0041137C lea edi,[ebp+FFFFFF40h] 00411382 mov ecx,30h 00411387 mov eax,0CCCCCCCCh 0041138C rep stos dword ptr es:[edi] 6: ps = &gs; 0041138E mov dword ptr ds:[00417140h],417144h 7: *ps = 12; 00411398 mov eax,0Ch 0041139D mov ecx,dword ptr ds:[00417140h] 004113A3 mov word ptr [ecx],ax 8: } 004113A6 xor eax,eax 004113A8 pop edi 004113A9 pop esi 004113AA pop ebx 004113AB mov esp,ebp 004113AD pop ebp 004113AE ret 6 X1 u+ S6 d7 f& S2 M( \
% Y8 e9 i- P6 C( o* R3 C. y( j/ ~ _
实例3:
- G4 s9 [" ], u, Z, ^; g% i! Z#include <stdio.h> char gc; char * pc; void main(int argc, char **argv) { pc = &gc; *pc = 12; }
0 F/ P. E+ R, @6 c2 P& W+ K 1: #include <stdio.h> 2: char gc; 3: char * pc; 4: void main(int argc, char **argv) 5: { 00411370 push ebp 00411371 mov ebp,esp 00411373 sub esp,0C0h 00411379 push ebx 0041137A push esi 0041137B push edi 0041137C lea edi,[ebp+FFFFFF40h] 00411382 mov ecx,30h 00411387 mov eax,0CCCCCCCCh 0041138C rep stos dword ptr es:[edi] 6: pc = &gc; 0041138E mov dword ptr ds:[00417140h],417144h 7: *pc = 12; 00411398 mov eax,dword ptr ds:[00417140h] 0041139D mov byte ptr [eax],0Ch 8: } 004113A0 xor eax,eax 004113A2 pop edi 004113A3 pop esi 004113A4 pop ebx 004113A5 mov esp,ebp 004113A7 pop ebp 004113A8 ret
1 d9 V. O& b" @
/ H( v% i1 [. i2 F* y) B可以看出指针的类型信息决定了赋值/读取时读/写多少个字节。! }/ z+ ]3 z7 H1 I5 T1 z2 Z; U
读/写多少字节的信息不是存放在指针变量中,而是放到了与该地址相关的赋值指令中。
- T" y9 A9 D' H+ K* a |