接题目:
你写的代码如下:
/* 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;
}