马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 kangels 于 2013-3-19 10:23 编辑 1 q4 S% A! X" e8 `5 l1 }8 C: k a
' @: ~* f6 ?9 Q) o+ ^$ U( c6 K丢失的类型信息
! A* U$ b& P, k* L猜测
* N# l5 }5 m: j指针变量应该存储两方面的信息:地址,类型信息7 O3 w4 ^8 d" D
& W* E9 d ^! ^ ^实证8 P% P- d _0 m2 ~8 e5 K/ I8 ?" D
用sizeof(),float *,int*,double *....都是4字节没有存储类型信息只有地址信息
. o+ b; B) h/ P3 X u3 G* N反汇编一段代码来看看
) ]. f+ P7 C, e实例1:
5 W) Z7 J; J" [$ B5 e) {#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
3 ^& q# i, ^2 w- F1 N% }1 r' _2 n- n6 v' ^3 ~: D" ?) J5 W
实例2:
7 i0 ^" W, P% N9 {. T9 J#include <stdio.h> short gs; short * ps; void main(int argc, char **argv) { ps = &gs; *ps = 12; }
; K8 m+ W) S0 R) t 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
0 l2 \1 `0 E3 S) M6 w5 F' N; V
9 s& T3 V; T% J, j N2 M实例3:4 e" G6 Y, I$ t% X) W& |) {
#include <stdio.h> char gc; char * pc; void main(int argc, char **argv) { pc = &gc; *pc = 12; }
7 P. Q3 E# V9 Y( q& S0 _+ E 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
. w5 O o( p- T4 e* e
2 O; e+ e$ n$ v: G可以看出指针的类型信息决定了赋值/读取时读/写多少个字节。
7 V' E) i, K. m; h& F读/写多少字节的信息不是存放在指针变量中,而是放到了与该地址相关的赋值指令中。
* c) q8 a$ Q- o! T. O3 S1 p7 B6 Q0 q |