memset函数与memcpy函数学习

memset函数

memset()函数是初始化内存的万能函数,通常为新申请的内存进行初始化内工作,比如malloc()函数申请一连串的内存单元,但是没有对内存空间进行初始化,这里就是memset()函数需要做的事情。
函数的原型:void *memset(void *s, int c, size_t n);
头文件:#include <string.h>
返回值:s的值。
函数的作用:将参数s所指向的内存前n个字节以参数c填充。也就是在一段内存块中填充某个给定的值。
因为该函数只能填充一个值,所以它无法将变量初始化程序中需要的数据。用该函数初始化后,后边的程序在向该内存空间中此南方需要的数据。
memset()函数是对较大数组或者结构体以及动态内存清零和赋值的最快方法;因为它直接对内存进行操作。
注意:memset()函数是不可以对整型数组直接进行初始化赋值的(除了0以外),因为memset()函数是以字节为单位进行赋值的,但是如果是整型的话,就会占用四个字节,函数会将四个字节分别进行赋值,这就导致结果与我们函数传参的整数出现了较大的差异。
下边代码解释更清楚。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
 int i,j,k,m=3,n=5;        //c语言中局部变量没有显式的初始化; 
 int *p1,*p2;
 char *p3;
  p1=(int *)malloc(sizeof(int)*m);
 p2=(int *)malloc(sizeof(int)*n);
 p3=(char *)malloc(sizeof(char)*n);
  if((p1!=NULL)&&(p2!=NULL)&&(p3!=NULL)){
   printf("三处内存均申请成功\n");
   memset(p1,0,sizeof(int)*m);
   memset(p2,2,sizeof(int)*n);
   memset(p3,2,sizeof(char)*n);
   printf("p1申请整型动态空间初始化为 0 的结果:"); 
   for(i=0;i<m;i++){
    printf("%d  ",p1[i]); 
   }
   printf("\n");
   printf("p2申请整型动态空间初始化为 2 的结果:");
   for(j=0;j<n;j++){
    printf("%d  ",p2[j]);
   }
   printf("\n");
   printf("p3申请char型动态空间初始化为 2 的结果:");
   for(k=0;k<n;k++){
    printf("%d  ",p3[k]);
   } 
  }
 free(p1);
 free(p2);
 free(p3);
 p1=NULL;
 p2=NULL;
 p3=NULL;
 return 0;
}

运行结果:

为什么整型数组初始化为2的结果与事实相违?这就是我们注意中提到的问题,整型数组占四个字节,而memset()函数给每一个字节都赋予了2,转化成八进制就是“10000000100000001000000010”;然后转化成十进制就是我们的输出结果:33686018。
char型本身就是每一个字符占一个字节,所以通过memset()函数赋值几就是几。

memcpy函数

函数的原型:void *memcpy(void *dest,const void *src,size_t n);
头文件:#include<string.h>
函数的作用:拷贝src 所指向的内存前n个字节到dest所指向的内存。
返回值:dest的值。
顺便区别一下memcpy()函数与strcpy()函数的区别:
相比较memcpy()函数的用途更为广泛;

  1. strcpy函数只能复制字符串,但是memcpy()函数就不一样了,memcpy()函数可以复制任意内容,例如整型,结构体,字符数组等等;
  2. memcpy()函数可以指定复制内容的长度,但是strcpy()函数无需长度,直到遇到结束符’\0’才结束。
    以下代码做比较以及解释:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
 char *a,*b;
 int *d;
 int f[6]={1,2,3,3,2,1};
 char c[]=" China  i love y";
 a=(char *)malloc(sizeof(char)*30);
 b=(char *)malloc(sizeof(char)*30);
 d=(int *)malloc(sizeof(int)*20);
 char *p1=a;
 char *p2=b;
 if((a!=NULL)&&(b!=NULL)&&(d!=NULL)){
  printf("三处动态内存均申请成功;\n");
  memset(a,'\0',sizeof(char)*30);
  memset(b,'\0',sizeof(char)*30);
  strcpy(a,"Hello!");
  strcpy(b,"Hello!");
  puts(a);  
  memcpy(p1+6,c,4);
  puts(a);
  strcpy(p2+6,c);
  puts(b);
  memset(d,0,sizeof(int)*20);
  memcpy(d,f,6*sizeof(int));
  int i;
  for(i=0;i<10;i++){
   printf("%d",d[i]);
  }
  printf("\n");
 }
 free(a);
 a=NULL;
 free(b);
 b=NULL;
 free(d);
 d=NULL;
system("pause");
 return 0;
}

运行结果:
在这里插入图片描述
上边代码第一次出场地方是memcpy()函数复制整型数组时我的第三个参数没有*sizeof(int),导致结果不符,这是因为memcpy()函数是以字节为单位进行复制的,所以整型需要乘以四个字节;

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值