重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
动态内存分配即分配内存大小在运行时才确定,一般在堆中分配。
创新互联建站长期为上1000家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为灵寿企业提供专业的网站制作、做网站,灵寿网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
C语言动态内存分配相关的函数如下几个:malloc、calloc、realloc、free;
malloc函数的使用比较直接,一个成功的malloc调用返回分配的size大小的内存的指针。失败时返回NULL并将错误代码置为ENOMEM。
calloc函数可以分配nr个size大小的内存空间,一般用于一组struct结构体的分配。
realloc函数将ptr指向的内存空间重新分配大小为size并返回新的内存首地址。
free函数释放前三个函数申请的内存空间,所以,使用前三个分配函数分配的内存一定要free掉。
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes)。
参数:num_bytes 是无符号整型,用于表示分配的字节数。
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实现malloc的方法:
首先我们要确定所采用的数据结构。一个简单可行方案是将堆内存空间以块的形式组织起来,每个块由meta区和数据区组成,meta区记录数据块的元信息(数据区大小、空闲标志位、指针等等)。
数据区是真实分配的内存区域,并且数据区的第一个字节地址即为malloc返回的地址 。
c语言中malloc是动态内存分配函数,malloc()函数其实就在内存中找一片指定大小的空间,然后将这个空间的首地址范围给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc()函
C语言中malloc是动态内存分配函数。
函数原型:void *malloc(unsigned int num_bytes);
参数:num_bytes 是无符号整型,用于表示分配的字节数。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
功能:分配长度为num_bytes字节的内存块
注意:当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
实例:
#include"stdio.h"
#include"malloc.h"//malloc()函数被包含在malloc.h里面
int main(void)
{
char*a=NULL;//声明一个指向a的char*类型的指针
a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a
if(!a)//如果malloc失败,可以得到一些log
{
perror("malloc");
return-1;
}
sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址
printf("%s\n",a);//输出用户输入的数据
free(a);//释放掉使用的内存地址
return0;//例2有无内存泄露?
}
好吧,我来接分的。顺便教你怎么恢复。
#include stdio.h
#include windows.h
unsigned char enter[5];
unsigned char jmp[5];
int Func()
{
return 4;
}
int MyFunc()
{
return 5;
}
bool hook()
{
DWORD dwOld=0;
if(!VirtualProtect(Func,5,PAGE_EXECUTE_READWRITE,dwOld))
{
return false;
}
memcpy(Func,jmp,5);//写入构造的地址
//刷新指令cache中相关地址指令的内容
HANDLE hProcess = GetCurrentProcess();
FlushInstructionCache(hProcess,(LPVOID)Func,5);
return true;
}
bool unhook()
{
DWORD dwOld=0;
if(!VirtualProtect(Func,5,PAGE_EXECUTE_READWRITE,dwOld))
{
return false;
}
memcpy(Func,enter,5);//写入原来的地址
HANDLE hProcess = GetCurrentProcess();
FlushInstructionCache(hProcess,(LPVOID)Func,5);
return true;
}
void main()
{
memcpy(enter,(LPVOID)Func,5);//保存原地址
jmp[0]=0xe9;//动态构造一个长跳转指令
*(int*)jmp[1]=(int)MyFunc-((int)Func+5);
hook();
int a = Func();
printf("%d\n",a);
unhook();
int b = Func();
printf("%d\n",b);
}