Fid*_*its 4 c pointers casting function sizeof
我从很多人那里听说你不能保证类型转换会无损.只有在您不了解处理器时才会这样,也就是说,您还没有验证用于数据类型的字节数?让我举个例子:
如果执行以下操作:
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);
Run Code Online (Sandbox Code Playgroud)
......输出如下......
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)
您能否假设在所有情况下都可以安全地将特定数据类型指针类型转换为另一个数据类型指针?例如,如果您执行此操作:
int foo(float, char)
{
}
void *bar(void)
{
return (void *)foo;
}
int (*pFunc)(float, char) = bar();
Run Code Online (Sandbox Code Playgroud)
你能否pFunc确定地址为foo?
关于您的特定代码示例,让我们参考C99语言标准的第6.3.2.3节:
指针
void可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可以转换为指向void和返回的指针; 结果应该等于原始指针.
请注意,指向函数的指针与指向对象的指针不同.唯一提到指针到函数的转换是:
指向一种类型的函数的指针可以被转换为指向另一种类型的函数的指针并且再次返回; 结果应该等于原始指针.如果转换的指针用于调用类型与指向类型不兼容的函数,则行为未定义.
所以你的代码示例调用了未定义的行为.
如果我们避免使用函数指针转换,以下段落将解释所有内容:
指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.否则,当再次转换回来时,结果将等于原始指针.
注意:在指针类型之间进行转换是转换然后解除引用的一个单独问题(通常,只有在转换为char *解除引用然后解除引用时才有效.)