memcpy()之小端模式

文章介绍了memcpy函数的用法,指出在复制整型数据时由于小端模式导致输出逆序,而字符串则按正常顺序。还提到读取寄存器时同样存在小端问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数原型

void memcpy(voiddestin, const void *src, size_t n);

功能

由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

头文件

#include<string.h>

返回值

函数返回一个指向dest的指针。

例1:如果用来复制字符串,输出的顺序是正常的

#include<stdio.h>
#include<string.h>
int main()
{
	char* s="1a2b3c4d";
	char ch[20];
	memcpy(ch,s,strlen(s));
 	ch[strlen(s)]='\0';//因为从d[0]开始复制,总长度为strlen(s),d[strlen(s)]置为结束符
  printf("%s",d);
  return 0;
}
//输出结果为1a2b3c4d

例2:如果用来复制整形(多字节数据),输出结果是逆向的

#include <stdio.h>
#include <string.h>
int main()
{
    int sh=0x1a2b3c4d;
    char ch[4];
    memcpy(ch,&sh,4);
    printf("%2x%2x%2x%2x\n",ch[0],ch[1],ch[2],ch[3]);
    return 0;
}
//输出结果为4d3c2b1a

在这里插入图片描述
其原因在于,计算机在存储整形数0x1a2b3c4d时,采用的小端模式,即低位在左,高位在右,4d为低位放在低地址,1a高位放在高地址:

地址位0x1d9656c00x1d9656c10x1d9656c20x1d9656c3
数据4d3c2b1a

所以拷贝后输出顺序是反着的。而字符串的存储则是正常顺序(1a到4d从左往右依次存放),所以输出也是正常顺序。

补充:读寄存器多位时也会存在小端问题。还是这个例子里,寄存器0x1d9656c0开始连续四字节分别是0x4d、0x3c、0x2b、0x1a,按照以下的写法来读寄存器的最低位:

int num=*((int *)0x1d9656c0); //最后输出结果就是0x1a2b3c4d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值