2

我想编写一个带有两个参数的函数:指向任意内存块的 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 函数,以便我仍然使用后缀运算符,但应用于类型转换的指针?

4

1 回答 1

3

Convert the void * to a RECORD * straight away and then use that pointer for the rest of the function.

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;
    }
}

I also made some stylistic changes here, such as better variable names and adding const.


On a side note, as Clement Rey says it'd be better to use a typedef than a define.

typedef struct record record_t;

You can even combine the typedef with the struct definition:

typedef struct {
    char nam[32];
    double val;
} record_t;
于 2012-12-22T20:52:01.260 回答