memcpy函数语法 用法 例子______转

2012年6月1日9:45:11
    该例子说明几个问题
    1. mem开头的函数基本上都是对内存操作的,
    它们不管内存里放的是什么数据,只要给出长度,它们就操作。
    不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。
    mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。
    2. memcpy是内存复制函数
      原型: 
        void * memcpy(void *dest, void const *src, unsigned int length); 
      功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种
            方法复制任何类型的值,第3个参数指定复制值的长度(以字节计)。
            如果src和dst以任何形式出现了重叠,它的结果是未定义的
    3. memset函数
      原型:void * memset(void *a, int val, unsigned int length);
      功能:把从a开始的length个字节都设置为值val。
      例子:memset(buffer, 0, SIZE);

测试环境vc6.0
********************************************************************/
  
  
#include <stdio.h>
#include <string.h>     // 包含memcpy函数

#define SIZE     10

int main ( void )
{
/* 
  int i = 0;
  char a[10] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09};
  char b[5];

  memcpy(b, a, 10);

  for (i = 0; i < 5; i++)
  {
    printf("b[%d] = %d\n", i, b[i]);
  }

  //printf("b[5] = %d\n", b[5]);    // 引用超过数组下标的元素,编译不会报错,但逻辑上就错了。
*/

/*
  int i;
  int a[5] = {1, 2, 3, 4, 5};
  int b[10];

  memcpy(b, a, sizeof(int) * 5);

  for (i = 0; i < 10; i++)
  {
    printf("b[%d] = %d\n", i, b[i]);
  }
*/

/*
  // 数组src和dst都是char类型,从数组src复制SIZE个字节到数组dst.
  // 但是,两个数组都是整型数组该怎么办?参见下面的例子。
  int i;
  char src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};
  char dst[SIZE];
  
  memcpy(dst, src, SIZE);
  
  for (i = 0; i < SIZE; i++)
    printf("%-5d ", dst[i]);
    
  printf("\n");
*/

/*
  // 数组src和dst都是int类型,将数组src内容复制到dst数组。
  // 前两个参数并不需要使用强制类型转换,因为在函数的原型中,参数的类型是 void *型指针,
  // 而任何类型的指针都可以转换为void *型指针。
  int i;
  int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};
  int dst[SIZE];
  
  memcpy(dst, src, sizeof(int) * SIZE);
  //memcpy(src,dst, sizeof(dst));
  
  for (i = 0; i < SIZE; i++)
    printf("%-5d ", dst[i]);
    
  printf("\n");
*/  


  // 如果数组只有部分内容需要被复制,那么需要复制的数量必须在第3个参数中指明。
  // 对于长度大于一个字节的数据,要确保把数量和数据类型的长度相乘。
  int i;
  int src[SIZE] = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10};
  int dst[SIZE];
  
  memcpy(dst, src, sizeof(int) * 3);
  
  for (i = 0; i < SIZE; i++)
    printf("%-5d ", dst[i]);
    
  printf("\n");
 
  return 0;
}
/********************************************************************
b[0] = 0
b[1] = 1
b[2] = 2
b[3] = 3
b[4] = 4
Press any key to continue


b[0] = 1
b[1] = 2
b[2] = 3
b[3] = 4
b[4] = 5
b[5] = -858993460
b[6] = -858993460
b[7] = -858993460
b[8] = -858993460
b[9] = -858993460(随机数)
Press any key to continue


1     2     3     4     5     6     7     8     9     10
Press any key to continue


1     2     3     4     5     6     7     8     9     10
Press any key to continue


1     2     3     -858993460 -858993460 -858993460 -858993460 -858993460 -858993460 -858993460(随机数)
Press any key to continue
注意:这个语句有些编译器在编译时给警告,编译可以通过。
      执行时可能程序崩溃,因为内存访问非法,因为b定义时长度就5,
      这里复制了长度为10,超出了b的长度,但memcpy会照样复制过去,
      这时系统的安全机制就会触发,产生一个内存访问中断。程序就挂了。
********************************************************************/
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值