我听很多人说过,你不能保证类型转换不会有损失。这只有在你不知道你的处理器,也就是说,你没有验证数据类型使用的字节数时才会发生。让我举个例子:
如果你执行以下操作:
typedef struct
{
int i;
char c;
float f;
double d;
} structure;
size_t voidPtrSz = sizeof(void *);
size_t charPtrSz = sizeof(char *);
size_t intPtrSz = sizeof(char *);
size_t floatPtrSz = sizeof(float *);
size_t doublePtrSz = sizeof(double *);
size_t structPtrSz = sizeof(structure *);
size_t funcPtrSz = sizeof(int (*)(float, char));
printf("%lu\n", voidPtrSz);
printf("%lu\n", charPtrSz);
printf("%lu\n", intPtrSz);
printf("%lu\n", floatPtrSz);
printf("%lu\n", doublePtrSz);
printf("%lu\n", structPtrSz);
printf("%lu\n", funcPtrSz);
…输出结果如下…
4
4
4
4
4
4
4
你是否可以假设在所有情况下都可以安全地将一个特定数据类型的指针强制转换为另一种数据类型的指针?例如,如果你执行以下操作:
int foo(float, char)
{
}
void *bar(void)
{
return (void *)foo;
}
int (*pFunc)(float, char) = bar();
你能确信地假设
pFunc
拥有 foo
的地址吗?
typedef void (*vf_p)();
并且将bar
函数中的返回类型和强制转换从void *
改为vf_p
,那么代码就会按照你的期望运行。 - Andrey Mishchenkovoid*
。 - Fred Foosize_t
类型,使用"%zu"
。 - alk