几个注意点:
1.strlen
strlen 接收字符串数组,不接受非字符串数组,例如定义一个这样的数组:
int src[ 8 ] = { 1, 2, 3, 4, 5, 6, 7, 8 }; 不能用来计算长度大小。
如果要获取整型数组的长度大小的话,可以这样,sizeof( src )/sizeof( int ),
标记绿色的是每个数据元素的占用内存大小。
2.memcpy
原型 : void * memcpy( void * dest, const void * src, size_t n );
memcpy函数的功能:从源src所指向的内存的起始位置开始复制n个字节到目标dest所指的内存的起始位置。
在上面的表述中,”src 所指向的内存的起始位置开始的n个字节“,假设我们的src 是0x22feec ,那么下来的n
个字节地址分别是多少呢?我们做一下测试:
#include <stdio.h>#include <stdlib.h>#include <string.h>intmain( void ){int i;int src[8] = {1,2,3,4,5,6,7,8};int dest[8];memcpy( dest, src, sizeof( src ) );for( i = 0; i < sizeof( dest )/sizeof( int ); i++ )printf( "%d ",dest[ i ] );for( i = 0; i < 8; i++ )printf( "\n%x", &src[ i ]);return 0;}运行结果如下:
程序按照我们预设的将src里面的八个连续数据连续复制到dest数组里面,我们打印出src的各个元素
地址,他们是依次增大的。所以我们可以写出答案,22fef022fef422fef8 22fefc
顺便验证一样我们这台机器的Endian模式到底是不是之前测试的小端模式(高字节放于高地址,低字节放于低地址)
#include <stdio.h>#include <stdlib.h>#include <string.h>intmain( void ){int i;int src[8] = {1,2,3,4,5,6,7,8};int dest[8] = { 0 };memcpy( dest, src, sizeof( src ) );for( i = 0; i < 8; i++ )printf( "\n%x-", &dest[ i ]);for( i = 0; i < sizeof( dest )/sizeof( int ); i++ )printf( "%d ",dest[ i ] );for( i = 0; i < 8; i++ )printf( "\n%x", &src[ i ]);return 0;}加入打印dest各个元素地址的输出程序,运行结果如下:
地址也是由低到高,因此,src低地址的元素是被复制到dest的低地址上的,所以为小端模式。
这里有一道笔试题:
某32位处理器采用小端模式进行数据存放,已知char型指针p(指向字符型数据的指针,,可以理解为指向一块8位内存的指针)指向的一段内存的十六进制内容为:00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F,
int a,b;
p += 0x0a;
memcpy( &a, p, sizeof( int ) );
问,a = ______
由题目可以知道,原来的p = 0x00;然后 p += 0x0a, p = 0x0a;
memcpy( &a, p, sizeof( int ) );这句是将p指针所指向的地址(起始地址)开始的4个字节(sizeof( int ))数据复制到a变量所在地址。
p = 0x0a;
开始复制数据了,按照低数据对应低地址,高数据对应高地址的原则进行复制。。。。。
完成 ! a = 0x0d0c0b0a
3.memset
函数原型: memset (void* s, int x, size_t n);
函数功能:将s 前n个字节用 x 代替
说法:memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。memset比较简单粗暴,memcpy带有特定意图。
生活的最大悲剧不是失败,而是一个人已经习惯于失败。