在C中,你是否可以直接从某种指针转换到另一种指针?

时间:2011-10-17 05:14:32

标签: c pointers

假设你从一个void指针,一个char指针,一个int指针,或者你想要命名的任何东西开始。

    void *p = // initialized to something here

我们进行转换,如

    *((int *)((char *)p + 6)) = 5;

这是否意味着我们基本上将一个void指针转换为char指针,进行一些算术运算,将其转换为int指针,然后将其取消引用以存储5?

或者我们是否需要将char指针强制转换回void指针,然后才能将其强制转换为int指针?

* 此外,在从char *转换为int *之前,是否需要在转换之前的某处取消引用?

4 个答案:

答案 0 :(得分:7)

您展示的转化在语法上是有效的C.在void *的路上通过int *类型投射没有任何区别。

它是否在语义上正确取决于(char *)p + 6指向的内存是否正确调整大小并对齐以便以int进行访问。

答案 1 :(得分:1)

将一个char指针转换回一个void指针,然后再将它转换为一个int指针,这不会比只是将一个char指针转换为一个int指针更好。你必须真正知道你在做什么才能使它工作,因为你必须处理对齐问题。

答案 2 :(得分:1)

在允许潜在危险的指针类型转换时,C比C ++宽松得多。它源于C的“程序员知道他们在做什么”的哲学。但是,由于类型转换的潜在危险,C ++引入了三种类型的转换:static_castdynamic_castreinterpret_cast

推荐阅读:

  1. http://www.crasseux.com/books/ctutorial/Pointer-types.html
  2. http://www.cplusplus.com/doc/tutorial/typecasting/

答案 3 :(得分:0)

从指向一个整数类型的指针转​​换到指向另一个整数类型的另一个指针是未定义的行为,如果它导致对齐问题(C99 6.3.2.3)。如果没有,您可以安全地在它们之间施放。 char是整数类型。

(C标准在这里有点奇怪,声明这是UB。这应该是实现定义的行为,因为它取决于特定的CPU架构并且在许多情况下是安全的。)

就你的具体例子而言,它确实意味着你描述的内容。其背后的原因很可能是:

  • 您无法在void指针上执行指针算术。因此它被类型化为char *,因此地址可以更改为原始的一个+ 6 * sizeof(char),即6个字节。
  • 希望程序员知道对齐,并且可以安全地将该特定地址处的任何内容作为int进行处理。如果是这样,将类型转换为int *是完全安全的。