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带有特定意图。
- C Language Study - strlen & memcpy & memset
- 汇编实现memcpy,memset,strcat,strlen
- strcpy memcpy strcat strcmp memset strlen
- 汇编实现memcpy,memset,strcat,strlen
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... )
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... ) .
- 纯C 字符串操作函数 实现 (strcpy, strncpy, memcpy, memset, strcat, strlen ... )
- C语言中strcpy、strcmp、strlen、strcat、memcpy、 memset的用法。
- C Language Study - #error
- C Language Study - static
- C Language Study - 柔性数组
- C Language Study - 内存分区
- [VC6.0]汇编版memcpy/memset/strlen/strcpy
- atoi itoa strcpy strcmp strlen strcat memcpy memset实现
- c++ memset 、memcpy、strcpy、strlen、strcat、ASCII 问题
- C++:memset ,memcpy 和strcpy 的区别
- C语言Memset()与memcpy()总结
- memcpy/memset函数的c语言实现
- android 中fragment和activity的区别?
- Oracle - 数据库的实例、表空间、用户、表之间关系
- jvm性能调优
- Android之ListView异步加载网络图片(优化缓存机制)
- Android系列之网络(三)----使用HttpClient发送HTTP请求(分别通过GET和POST方法发送数据)
- C Language Study - strlen & memcpy & memset
- 关于Python报错:SyntaxError: Non-ASCII character '\xe5'的解决方法
- 关于H-JTAG的NANDFLASH烧写方法以及2416初始化脚本的问题
- Android系列之网络(二)----HTTP请求头与响应头
- Merge Sorted Array
- Oracle bigfile 大文件表空间
- 一些经常用到的Check方法(Java) validate 1
- 什么是MyEclipse Tomcat服务器?
- HDoj-2717-Catch That Cow-BFS