strlen memcpy memset

几个注意点:

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带有特定意图。

生活的最大悲剧不是失败,而是一个人已经习惯于失败。

strlen memcpy memset

相关文章:

你感兴趣的文章:

标签云: