我对类型转换有疑问。这只是这里显示的虚拟程序。实际代码太大而无法发布。
typedef struct abc
{
int a;
}abc_t;
main()
{
abc_t *MY_str;
char *p;
MY_str = (abc_t *)p;
}
每当我运行质量分析检查工具时,我都会收到2级警告:
Casting to different object pointer type. REFERENCE - ISO:C90-6.3.4 Cast Operators - Semantics <next> Msg(3:3305) Pointer cast to stricter alignment. <next>
有谁能告诉我如何解决这个问题?
答案 0 :(得分:2)
简单 - 您的静态分析工具(btw?)已经确定char*
没有特定的对齐要求(它可以指向内存中的任何位置)而abc_t*
可能有一个单词对齐要求(int
必须在4/8字节边界上)。
实际上,由于char*
位于堆栈中,因此在大多数体系结构中它都是字对齐的。你的工具看不到这个。
答案 1 :(得分:1)
在您的实施中(可能还有许多其他人),每个int
必须位于可被sizeof int
整除的地址,通常为4。
另一方面,char
可以在任何地址。
就像将3.25
分配给int
变量一样。这也是不可能的。
所以当你有一个坏指针时,你可能会从你的机器上得到一个例外,从技术上讲这个代码会调用未定义的行为。
答案 2 :(得分:1)
char*
可以在任何字节边界上对齐,这意味着如果将其强制转换为结构,则可能无法满足该结构的对齐要求(例如SIMD类型需要16字节边界)。 / p>
答案 3 :(得分:1)
您的代码无效C.如果您发现自己正在做这样的事情,那可能是更大误解的结果。例如,我猜你想要从文件/套接字/等中读取abc_t
对象。并且您习惯于将char
指针传递给read
/ recv
/任何函数。相反,你应该声明一个abc_t
类型的对象,并将其地址传递给你正在使用的任何阅读函数。