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会照样复制过去,
这时系统的安全机制就会触发,产生一个内存访问中断。程序就挂了。
********************************************************************/