2.72-给你一个任务,写一个函数,将整数val复制到缓冲区buf中,但是只有当缓冲区中有足够可用的空间时,才执行复制。

接题目:

你写的代码如下:

/* Copy integer into buffer if space is available */
/* WARNING: The following code is buggy */
void copy_int(int val, void* buf, int maxbytes) {
	if (maxbytes - sizeof(val) >= 0)
		memcpy(buf, (void*)&val, sizeof(val));
}

这段代码使用了库函数memcpy。虽然在这里用这个函数有点刻意,因为我们只是想复制一个int,但是它说明了一种复制较大数据结构的常见方法。
你仔细地测试了这段代码后发现,哪怕maxbytes很小的时候,它也能把值复制到缓冲区中。
A.解释为什么代码中的条件测试总是成功。提示: sizeof运算符返回类型为size_ t的值。
B.你该如何重写这个条件测试,使之工作正确。

开始作答 官方答案(已验证)

A.Sizeof (val)返回类型size_t,它通常是一种无符号类型。计算maxbytes-sizeof(val)得到size_t类型的值,它总是>= 0。
B.

#include <stdio.h>
#include <assert.h>
#include <string.h> 
#include <stdlib.h>

void copy_int(int val, void* buf, int maxbytes) {
	/* compare two signed number, avoid someone set maxbytes a negetive value */
	if (maxbytes >= (int)sizeof(val)) { 
		memcpy(buf, (void*)&val, sizeof(val));
	}
}

int main(int argc, char* argv[]) {
	int maxbytes = sizeof(int) * 10;
	void* buf = malloc(maxbytes); 
	int val; 

	val = 0x12345678;
	copy_int(val, buf, maxbytes);
	assert(*(int*)buf == val); 

	val = 0xAABBCCDD; 
	copy_int(val, buf, 0); 
	assert(*(int*)buf != val); 

	free(buf); 
	return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

origami林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值