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 就清空了
所以可以总结一下,函数中的指针参数在函数里不可改变,改变的是指针指向的内容。
- get_memory(char* p,int num)
- get_memory(char* p,int num) 续
- GetMemory(char **p, int num)
- char *GetMemory3(int num)的问题
- char *(*c[10])(int **p);
- int strncmp ( const char * str1, const char * str2, size_t num );
- char (*(*p[3])( int ))[5] 等等一系列
- { char *p,s[6];int n
- char (*(*p[3])( int ))[5] 等等一系列
- char (*(*p[3])( int ))[5] 问题剖析
- char *p = NULL,int *p = NULL的区别
- p->num,与p.num的区别
- static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别,char int *p,int const*p
- [leetcode] sqrt(int num)
- 解读复杂定义char *(*c[10])(int **p);
- c/c++ int atoi(char *p)的实现
- char*p char p [] char* p[]
- 关于 int *p = NULL; char *p = NULL; 的问题:
- WebBrowser-HTML DOM
- Java类成员变量的初始化顺序
- 著名搜索引擎简介
- jsp设置页面过期
- jquery 添加移除对象实例 append
- get_memory(char* p,int num)
- Log4j Full
- 在PB中如何实现数据模糊查询
- 第5章 文件安全
- 活动对象框架之二:活动对象及活动调度器
- sql 正则匹配查询
- 活动对象框架之三:使用活动对象
- 搜索引擎汇总
- 活动对象框架之四:使用活动调度器