马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kangels 于 2013-3-19 10:23 编辑 + |7 v G; h5 B0 }4 q' y2 ]
# P+ }/ c- d- G1 o9 |7 ~
丢失的类型信息3 S1 t9 F( Y9 Y6 y
猜测
# r* [, w3 O8 E8 z6 N指针变量应该存储两方面的信息:地址,类型信息
4 T& r) {7 e1 o& _- L4 K z
, f- E% x1 c# s" `, V5 T' p' H实证7 {; O+ H u) U p$ e
用sizeof(),float *,int*,double *....都是4字节没有存储类型信息只有地址信息
, ~& w" y* H* F反汇编一段代码来看看8 ?! ~# L+ W, i a) i
实例1:5 \; L2 b6 N4 z" X5 g. O- T
#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
6 y5 I( \2 F4 T6 U( k9 \$ s; v8 i" x" k) \. H9 E9 o
实例2:& D! _* z Q8 J
#include <stdio.h> short gs; short * ps; void main(int argc, char **argv) { ps = &gs; *ps = 12; }
9 N* W" Q. J& k4 j/ d 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
$ G& t7 U* r8 f- O3 ], ^5 |" T5 Z: T, l0 d; j! h5 t; i
实例3:3 E0 q: t0 b+ R4 A c0 y: D* X
#include <stdio.h> char gc; char * pc; void main(int argc, char **argv) { pc = &gc; *pc = 12; }
# A0 S |& }$ O4 r W# B 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 ! F8 X2 O( `4 V$ S* Q: W. }$ p
2 }+ y- H# C+ ^6 I4 z6 ~3 [
可以看出指针的类型信息决定了赋值/读取时读/写多少个字节。1 m, d$ J. A$ Y1 b
读/写多少字节的信息不是存放在指针变量中,而是放到了与该地址相关的赋值指令中。
! A' h8 ]8 Y$ u5 x% e, l |