内存堆分配操作函数的使用(realloc,malloc等)

来源:互联网 发布:淘宝网鼠标垫 编辑:程序博客网 时间:2024/05/16 01:03

1.realloc原型是extern void *realloc(void *mem_address, unsigned int newsize);,
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。新的大小一定要大于原来的大小,不然的话会导致数据丢失!
如:int *pn=(int *)malloc(5*sizeof(int));变更之后,pn=(int *)realloc(pn,10*sizeof(int));

2.malloc,原型:extern void *malloc(unsigned int num_bytes);分配长度为num_bytes字节的内存块,

Malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

int *bob; bob = (int *) malloc( sizeof(int) );

3.calloc,函数原型:void *calloc(unsigned n, unsigned size); 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。 char *str = NULL; str = (char*) calloc (10, sizeof(char));strcpy(str, "Hello");printf("String is %s\n", str);free(str);
跟malloc的区别:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。

4.strcpy,原型声明:extern char *strcpy(char* dest, const char *src);功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间

   说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
 char*strcpy(char*d,constchar *s)
 {
   char*r=d;
   while((*d++=*s++));
   returnr;
 }
5.
strncpy函数,原型,char*strncpy(char*dest,char *src, size_tnum );
(c/c++)复制src中的内容(字符,数字、汉字....)到dest,复制多少由num的值决定,返回指向dest的指针。如果遇到null字符('\0'),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。如:chardes[] = "Hello,i am!";charsource[] ="abc\0def";strncpy(des,source,5);
此时,des区域是这样的:a,b,c,\0,\0,逗号,i,空格,a,m,!  注意:\0,\0并不是添加在!的后面。


6.memcpy:void *memcpy(void *dest, const void *src, size_t n);从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

如:char *src="Golden Global View";char dest[20];memcpy(dest,src,( strlen(s)+1) );

strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。

3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy


7.memmove;原型:void *memmove( void* dest, void* src,count );由src所指内存区域复制count个字节到dest所指内存区域。

如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

char s[]="Golden Global View";    memmove(s,s+7,strlen(s)+1-7);  printf("%s",s);

8.memset,void *memset(void *s, int ch, size_t n);将s中前n个字节 (typedef unsigned int size_t)用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
如果要把一个char a[20]清零,则 memset(a,0,20);



9. fputc,原型,int fputc (int n, File *fp),函数功能: 将字符ch写到文件指针fp所指向的文件的当前写指针的位置。

   如:char msg[] ="Hello world";f =fopen("myFile.txt","w");for(i=0;i < strlen(s);i++)fputc(s[i],f);



0 0
原创粉丝点击