get_memory(char* p,int num)

来源:互联网 发布:nozzle水龙头淘宝 编辑:程序博客网 时间:2024/05/24 00:50

char* get_memory(char* p,int num)
{
    p=(char*)malloc(num*sizeof(char));
 
    return p;
}

 

 

 

 char *str = NULL;
 str = get_memory(str,12);
 strcpy(str,"helloWorld!");
 free(str);

 

反汇编

 

00411420    55              push    ebp
00411421    8BEC            mov     ebp, esp
00411423    81EC CC000000   sub     esp, 0CC
00411429    53              push    ebx
0041142A    56              push    esi
0041142B    57              push    edi
0041142C    8DBD 34FFFFFF   lea     edi, dword ptr [ebp-CC]
00411432    B9 33000000     mov     ecx, 33
00411437    B8 CCCCCCCC     mov     eax, CCCCCCCC
0041143C    F3:AB           rep     stos dword ptr es:[edi]
0041143E    C745 F8 0000000>mov     dword ptr [ebp-8], 0
00411445    6A 0C           push    0C
00411447    8B45 F8         mov     eax, dword ptr [ebp-8]        
0041144A    50              push    eax
0041144B    E8 2CFDFFFF     call    0041117C                            ;get_memory
00411450    83C4 08         add     esp, 8
00411453    8945 F8         mov     dword ptr [ebp-8], eax          ;返回eax给str
00411456    68 3C564100     push    0041563C                         ; ASCII "helloWorld!"
0041145B    8B45 F8         mov     eax, dword ptr [ebp-8]         
0041145E    50              push    eax
0041145F    E8 46FCFFFF     call    004110AA                             ;strcpy
00411464    83C4 08         add     esp, 8
00411467    8BF4            mov     esi, esp
00411469    8B45 F8         mov     eax, dword ptr [ebp-8]
0041146C    50              push    eax
0041146D    FF15 C4824100   call    dword ptr [<&MSVCR80D.free>]     ; MSVCR80D.free
00411473    83C4 04         add     esp, 4
00411476    3BF4            cmp     esi, esp
00411478    E8 BEFCFFFF     call    0041113B
0041147D    33C0            xor     eax, eax

 

我们看 call    0041117C                            ;get_memory

004113B0    55              push    ebp
004113B1    8BEC            mov     ebp, esp
004113B3    81EC C0000000   sub     esp, 0C0
004113B9    53              push    ebx
004113BA    56              push    esi
004113BB    57              push    edi
004113BC    8DBD 40FFFFFF   lea     edi, dword ptr [ebp-C0]
004113C2    B9 30000000     mov     ecx, 30
004113C7    B8 CCCCCCCC     mov     eax, CCCCCCCC
004113CC    F3:AB           rep     stos dword ptr es:[edi]
004113CE    8BF4            mov     esi, esp
004113D0    8B45 0C         mov     eax, dword ptr [ebp+C]
004113D3    50              push    eax                                                          ; size
004113D4    FF15 CC824100   call    dword ptr [<&MSVCR80D.malloc>]   ; MSVCR80D.malloc
004113DA    83C4 04         add     esp, 4
004113DD    3BF4            cmp     esi, esp
004113DF    E8 57FDFFFF     call    0041113B
004113E4    8945 08         mov     dword ptr [ebp+8], eax                       ;赋值
004113E7    8B45 08         mov     eax, dword ptr [ebp+8]

 

奇怪了, mov     dword ptr [ebp+8], eax 这里已经给str赋值了,那么

str=get_memory(str,12)可以这样写了

 

get_memory(str,12),我们再看看,出错了,

 

 mov     dword ptr [ebp+8], eax 这句的真正含义是  给str的复制值 写入eax

 

函数call的过程回顾一下

00411445    6A 0C           push    0C                                          //参数
00411447    8B45 F8         mov     eax, dword ptr [ebp-8]         //str的复制入栈
0041144A    50              push    eax

 

所以说 mov     dword ptr [ebp+8], eax  是对str的复制值写操作

0041144B    E8 2CFDFFFF     call    0041117C                            ;get_memory
00411450    83C4 08         add     esp, 8

 

这里add esp,8 就清空了

 

所以可以总结一下,函数中的指针参数在函数里不可改变,改变的是指针指向的内容。