1)malloc:内存分配函数,一般用于动态内存分配。
函数原型:extern void *malloc(unsigned int num_bytes);
头文件:malloc.h或 alloc.h,Visual C++6.0中可以用malloc.h或者stdlib.h。
功能:分配长度为num_bytes字节的内存块。
void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
malloc(unsigned int size); //向系统申请分配指定size个字节的内存空间。
返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
名称解释:malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)
malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。
int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
int* parr; parr = new int [100]; //返回类型为 int* 类型,分配大小为 sizeof(int) * 100;
malloc 则必须由程序员指定字节数,并且在返回后强行转换为实际类型的指针。
int* p; p = (int *) malloc (sizeof(int)*128);//分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double *pd = (double *) malloc (sizeof(double)*12);//分配12个double型存储单元,并将首地址存储到指针变量pd中
free 函数:用来释放malloc函数申请的动态内存,和malloc()函数配对使用。
用 法: void free(void *ptr);
注意:如果p是NULL指针,那么free对p 无论操作多少次都不会出问题。如果p不是NULL 指针,那么free对p连续操作两次就会导致程序运行错误。
2)memcpy:内存拷贝函数
函数原型:void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
所需头文件:#include
返回值:指向dest的指针
如果目标数组dest本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。
如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
举例1:
void main()
{
char *buf="My name is yanxiadong!";
char a[30]="This is a cup,good night!";
memcpy(a,buf+3,25);
puts(a);
system("pause");
}
输出:name is yanxiadong!
注意:长度n的设定,这里的n是25,而buf中的字节数少于25个字节,所以和字符串结束符'\0'一起拷贝过来了,到第一个字符串的结尾处就结束了。
举例2:
void main()
{
char *buf="My name is yanxiadong!";
char a[30]="This is a cup,good night!";
memcpy(a,buf+3,15);
puts(a);
system("pause");
}
输出结果:
这时,长度n是15,所以a中只有15个被覆盖了,而这15个字节中不含结束符'\0',a中后续的字符会补上。
举例3:
void main()
{
char *buf="My name is yanxiadong!";
char a[30];
memcpy(a,buf+3,15);
puts(a);
system("pause");
}
输出结果:
注意:由于a没有被初始化,而只拷贝了buf的前15字节的字符,后续的15字节是未知的,所以后面输出的是乱码。
解决办法是:及时给拷贝后的一个赋值‘\0’,或直接用字符串拷贝函数strcpy(),但是strcpy()不能指定长度;
举例4:
void main()
{
char *buf="My name is yanxiadong!";
char a[30];
memcpy(a,buf+3,15);
a[15]='\0';
puts(a);
system("pause");
}
举例5:用memset进行初始化
函数原型:void *memset(void *s,int ch,unsigned int n);
函数说明:将s中的前n个字节用ch替换并返回s。
作用:给某一内存块填充特定的值,可以对数组和结构体清零。
void main()
{
char *buf="My name is yanxiadong!";
char a[30];
memset(a,0,30);
memcpy(a,buf+3,15);
puts(a);
system("pause");
}
输出结果显示: