gpt4 book ai didi

c - 指针式类型转换

转载 作者:太空宇宙 更新时间:2023-11-04 04:29:56 24 4
gpt4 key购买 nike

我知道一种类型的指针可以转换为另一种类型的指针,例如,当使用 malloc 时,void 指针可以转换为另一种类型。但是我看过这段代码,它直接将值转换为指针类型。你能帮我了解发生了什么吗?

#include <stdio.h>
#include <stdlib.h>

enum otype {INT, SYM, CONS};
typedef struct obj {
enum otype type;
struct obj *p[1];
} obj;

int
main(void)
{

struct obj *o1 = (obj *) 10;
printf("%d\n", (int) o1);

struct obj *o2 = (obj *) "abc";
printf("%s\n", (char *) o2);

return 0;
}

最佳答案

您可以自由地将任何指针类型以及一些非指针类型转换为任何其他指针。这并不意味着结果有任何有用的意义。

指针只是一个整数,包含一些数据的内存地址。当您将它从一种类型转换为另一种类型时,您实际上是在告诉编译器相同的数字(内存地址)指的是不同的类型。根据源和目标类型,结果可能从有用到完全没有意义。

以你为例:

struct obj *o1 = (obj *) 10;

这告诉编译器将内存地址 10 (0xa) 视为包含 obj 类型的结构。由于内存地址 10 很可能不包含该指针,因此尝试实际取消引用该指针将导致未定义的行为。

struct obj *o2 = (obj *) "abc";

在这里,我们的理由稍微坚定一些(不多)。这是因为,即使我们不知道 o2 得到的地址是什么,我们也知道内存中有什么。该内存包含序列 0x61 0x62 0x63 0x00。假设有一台小型 Endian 机器(现在大多数都是这样),这意味着您的枚举包含(无效)值 6513249,并且您的指针与第一种情况一样未定义。

关于c - 指针式类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459827/

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