C语言#memcpy复制整型数组犯的低级错误

使用memcpy复制字符串时,

const int n = 50;
char str_1[] = "error";
char str_2[n];

memcpy(str_2, str_1, strlen(str_1) + 1);

        因为字符串是字符数组,其中的每一位占 1 字节,所以这里用strlen得出来的长度就是数组长度。

        在复制整型数组时,犯了以下错误:

int a[] = {0, 1, 2, 3, 4, 5, 6, 7};
int b[n];

memcpy(b, a, sizeof(a) / sizeof(a[0]));

        下意识的用 sizeof(a) / sizeof(a[0]) 去计算数组长度,导致复制后,打印b数组时,只有b[0] 和b[1]被复制了,为什么呢?看一看memcpy的原理:

 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1

        也就是说size_t n 是以字节为单位的,sizeof(a) / sizeof(a[0]) 得到 8, 是数组的长度,而不是数组所占的空间内存,这里只复制过去了 8 个字节,刚好就是两个int整型,即 a[0] 和 a[1] 被复制了,后面的元素没有被复制。

        只需要 sizeof(a) 就够了:

int a[] = {0, 1, 2, 3, 4, 5, 6, 7};
int b[n];

memcpy(b, a, sizeof(a));

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值