C Language Study - strlen & memcpy & memset

来源:互联网 发布:ios编程入门 编辑:程序博客网 时间:2024/04/29 10:00

几个注意点:

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 22fefc22ff00 22ff04 22ff08

顺便验证一样我们这台机器的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带有特定意图。

0 0
原创粉丝点击