M给出一个C程序
#include <stdio.h>
#include <stdlib.h>
int a;
int main()
{
int b;
int *c;
c = (int*)malloc(sizeof(int));
a = 1;
b = 2;
*c = 3;
free(c);
return 0;
}
这段代码定义了一个整型全局变量a,在主函数main()中定义了一个整型局部变量b和一个整形指针变量c,然后调用malloc()函数申请大小为1个整形变量的内存并把申请到的内存地址赋值给指针变量c,再依次给变量a、b和c指向的内存赋值1、2、3,接下来释放刚才申请到的堆内存,释放后退出主函数main()。
用OD加载
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 8
这里把栈顶向下压8个字节,为整型变量b和指针变量c开辟空间。它们都是局部变量。
.text:00401006 push 4 ; Size
.text:00401008 call ds:__imp__malloc
.text:0040100E add esp, 4
.text:00401011 mov [ebp+c], eax
一个整型变量占用的空间为4个字节,这里调用函数malloc()申请大小为4个字节的堆空间,然
后把申请到的内存空间地址赋值给变量c。
.text:00401014 mov ?a@@3HA, 1 ; int a
.text:0040101E mov [ebp+b], 2
.text:00401025 mov eax, [ebp+c]
.text:00401028 mov dword ptr [eax], 3
这里分别给三个变量赋值1、2、3。可以看到变量a所使用的内存空间地址是一个常量,它存在于程序的数据段中;变量b所使用到的内存空间地址是ebp+b,它位于栈区;指针变量c储存的数据是刚才由函数malloc()申请到的堆空间地址。
.text:0040102E mov ecx, [ebp+c]
.text:00401031 push ecx ; Memory
.text:00401032 call ds:__imp__free
.text:00401038 add esp, 4
.text:0040103B xor eax, eax
.text:0040103D mov esp, ebp
.text:0040103F pop ebp
这里调用函数free()来释放刚才由函数malloc()申请到的堆空间地址。