我想编写一个带有两个参数的函数:一个任意内存块的void指针类型和一个块字节大小。知道块中写入的结构类型,该函数应该打印包含的值。
但是,首先,我建议的代码不起作用:
#define RECORD struct record
struct record {
char nam[32];
double val;
};
void xprint (void *p, long j)
{
j /= sizeof(RECORD);
RECORD r;
while(j--){
r = *((RECORD *)p++);
printf("\n..%s.., ..%lf..\n",r.nam, r.val);
}
return;
}
所以,我提出了一些变更,主要是在代码的递增部分:
void print (void *p, long j)
{
j /= sizeof(RECORD);
RECORD r = *((RECORD *)p);
while(j--){
printf("\n%s,\t%8.2lf\n",r.nam, r.val);
r = *(++(RECORD *)p);
}
return;
}
现在它完成了这项工作,但代码看起来仍然不那么紧凑。
经过一番检查,我发现问题出在r = *((RECORD *)p++);
行。似乎在后缀增量时,p不再是类型化的,因此p仅增加一个字节。
是否可以重写xprint函数,以便我仍然使用postfix运算符,但应用于类型转换指针?
答案 0 :(得分:3)
立即将void *
转换为RECORD *
,然后将该指针用于该函数的其余部分。
void print (const void *p, size_t size)
{
const RECORD *r = p;
size_t count = size / sizeof(*r);
while (count--) {
printf("\n%s,\t%8.2lf\n", r->nam, r->val);
++r;
}
}
我还在这里做了一些风格上的修改,例如更好的变量名称和添加const
。
另一方面,正如Clement Rey所说,使用typedef比定义更好。
typedef struct record record_t;
您甚至可以将typedef与结构定义结合使用:
typedef struct {
char nam[32];
double val;
} record_t;