类型转换持续多长时间? (C)

时间:2012-12-22 20:49:01

标签: c casting increment

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

1 个答案:

答案 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;