关于类型转换的问题

时间:2011-08-26 06:18:49

标签: c alignment

我对类型转换有疑问。这只是这里显示的虚拟程序。实际代码太大而无法发布。

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>

有谁能告诉我如何解决这个问题?

4 个答案:

答案 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类型的对象,并将其地址传递给你正在使用的任何阅读函数。