我想编写一个带有两个参数的函数:一个指向任意内存块的空指针类型和一个 block 字节大小。知道 block 中写入的数据的结构类型后,该函数应该打印包含的值。
但是,起初,我建议的代码不起作用:
#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 函数,以便我仍然使用后缀运算符,但应用于类型转换的指针?
最佳答案
立即将 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;
关于c - 类型转换能持续多久? (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006470/