gpt4 book ai didi

c - 什么时候指针类型之间的转换不是 C 中的未定义行为?

转载 作者:太空狗 更新时间:2023-10-29 16:22:13 26 4
gpt4 key购买 nike

作为 C 的新手,我很困惑什么时候转换指针实际上是可以的。

据我所知,您几乎可以将任何指针类型转换为任何其他类型,编译器会让您这样做。例如:

int a = 5;
int* intPtr = &a;
char* charPtr = (char*) intPtr;

但是,通常这会调用未定义的行为(尽管它恰好适用于许多平台)。这就是说,似乎有一些异常(exception):

  • 你可以转换到void*自由地(?)
  • 你可以转换到char*自由地(?)

(至少我在代码中看到过...)。

那么指针类型之间的哪些转换不是 C 中的未定义行为?

编辑:

我尝试查看 C 标准(“6.3.2.3 指针”部分,位于 http://c0x.coding-guidelines.com/6.3.2.3.html ),但除了关于 void* 的部分外,并没有真正理解它。 .

编辑2:

只是为了澄清:我明确地只询问“普通”指针,即不是关于函数指针。我意识到类型转换函数指针的规则非常严格。事实上,我已经问过了:-): What happens if I cast a function pointer, changing the number of parameters

最佳答案

基本上:

  • a T * 可以自由转换为 void * 并再次返回(其中 T * 不是函数指针),并且您将获得原始指针。
  • a T * 可以自由转换为 U * 并再次转换回来(其中 T *U * 不是函数指针),如果对齐要求相同,你将得到原始指针。如果不是,则行为未定义。
  • 函数指针可以自由转换为任何其他函数指针类型并再次转换回来,您将获得原始指针。

注意:T *(对于非函数指针)始终满足char * 的对齐要求。

重要:这些规则都没有说明任何如果您将 T * 转换为 U 会发生什么* 然后尝试取消引用它。这是标准的一个完全不同的领域。

关于c - 什么时候指针类型之间的转换不是 C 中的未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4810417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com