69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char fun(char *p)
{
// 从此这快内存将被泄露掉
p = (char *)malloc(sizeof(char)*10);
// free(p);
// 是否该返回一个值呢?
return ((char)0);
}
char fun1(char **p)
{
// 数字10空间小了吧?
// "hello world"有11个字符,加上'\0',应该分配12个字节
*p = (char *)malloc(sizeof(char)*10);
}
char *fun2() //;是多余的吧,否则通不过编译吧?
{
// 数字10空间小了吧?
// "hello world"有11个字符,加上'\0',应该分配12个字节
char *p = (char *)malloc(sizeof(char)*10)
return p;
}
int main()
{
char *str = NULL;
char *p; // 是否还要声明一个p指针?似乎后面有用到
// error: 此处内存泄露,尽管程序退出所有内存会被释放,但还是自己释放的好
fun(str);
fun1(&str); // OK
p = fun2(); // OK: 不知道lz是否要这样写? 开始少了一个'('
// error:写越界了,你只分配了10个字节,实际需要12个字节
// 程序运气好崩溃,运气不好就不知道什么时候疯掉!
strcpy(str, "hello world");
// 这句运行结果恐怕难测:p指向的一片内存天知道是什么?
// 当然malloc()分配可能会统一把其清成某个值,但这种是不确定的
// puts()函数看不到结束标志'\0'誓不罢休
puts(p);
// 规范一点,加上这一句吧
return 0;
}
char *fun2()
{
push ebp
mov ebp,esp
sub esp,44h
push ebx
push esi
push edi
lea edi,[ebp-44h]
mov ecx,11h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi];以上为常规的寄存器入栈、预留44H字节的局部栈空间、初始化11H字节的空间为0CCCCCCCCh
char *p=(char *)malloc(sizeof(char)*10);
push 0Ah
call malloc (004011b0);调用malloc函数,返回值在eax中
add esp,4
mov dword ptr [ebp-4],eax;局部变量p入栈,其值在eax内
return p;
mov eax,dword ptr [ebp-4];p的值(分配的内存首地址)存储在eax中
}
pop edi
pop esi
pop ebx
add esp,44h
cmp ebp,esp
call __chkesp (00403130)
mov esp,ebp
pop ebp;以上做一些出栈恢复和检测工作
ret
call @ILT+35(function) (00401028)
mov dword ptr [ebp-8],eax;eax寄存器内就是分配的内存首地址,把他赋值给p。(同时,随着栈顶指针的恢复,局部变量p已经不在栈内了,也就是一般所说的“销毁”)