c - 类型转换能持续多久? (C)

标签 c casting increment

我想编写一个带有两个参数的函数:一个指向任意内存块的空指针类型和一个 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/

相关文章:

c++ - 使用 bit_cast 在 C++20 中将整数转换为 GLvoid* 是否有效?

c - 为什么 ICC 在 x86 上的汇编中生成 "inc"而不是 "add"?

c++ - 静态库如何工作? (C/C++)

c - 在 Linux 上检测竞争条件的方法有哪些?

typescript 错误地将元组推断为数组

c++ - 是否可以在类定义之外以某种方式提供相当于 operator bool cast 的东西?

javascript - 递增字符串中包含的特定数字

java - 如果 Java 不支持运算符重载,那么增量运算符如何在 Integer 实例上工作?

c - 命令两个线程的执行

c - 唤醒Windows sleep 模式的C函数(NOT C++,C#)