将一个空指针转换为结构体

38

我开始觉得熟悉 C 语言,但遇到了类型转换问题。如果我在一个 *.h 文件中定义了以下内容:

struct data {
    int value;
    char *label;
};

并且这个在另一个*.h文件中

# define TYPE      void*

我该如何将空指针转换为结构体,以便在函数中使用传递给它的变量“TYPE val”?例如,如果我想利用TYPE val所指向的值,我应该如何进行类型转换,以便将该值传递给另一个函数?


#define TYPE void* 是一个不好的想法。它至少应该是一个 typedef。考虑以下声明会发生什么:TYPE x, y; 或者 const TYPE x; - jamesdlin
2
此外,如果你在处理 C 语言中的 void* 指针时,并不需要进行任何显式的类型转换。C 允许对 void* 指针进行 隐式 转换:void* p = ...; struct data* val = p; - jamesdlin
@jamesdlin 我同意这是个不好的想法,但这不是我的想法,所以我必须跟进。因此,当TYPE val作为void指针传递到函数中时,我可以简单地声明struct data* temp = val;,然后将temp传递给函数,然后我应该能够使用temp->value? - user1852050
1
是的,然后你可以使用 temp->value - jamesdlin
谢谢,你的答案简单易懂并且非常有帮助。如果它被发布在答案部分,我会点赞的。 - user1852050
2个回答

43
(struct data*)pointer

将指向 void 的指针转换为指向 struct data 的指针。


也许我有点过度强调了,但在上面的例子中,这意味着为了将TYPE val转换为结构体指针,以便我可以访问它所指向的值,我会这样做:(struct data*)val?这到底是做什么的?如果我继续声明一个变量'int num = (struct* data)val',那么它会得到val所指向的数字还是只是val所指向的内存地址?如果是后者,我该如何进行转换才能访问'val'的值?感谢您的耐心。 - user1852050
那么我可以声明并分配一块临时结构体的内存,然后将其赋值为&val吗?就像是temp = &val这样。然后通过使用temp->value来获取值? - user1852050
你似乎不理解指针。指向事物的指针就像街道上房屋的地址,但它们并不是房屋本身。在C语言中获取house的地址,可以使用&house。在C语言中通过地址/指针获取house,可以使用*pointer。如果之前已经获得了pointer = &house;,并且pointer指向house类型,则*pointer等同于*(&house),最终等同于house - Alexey Frunze
指向某些非空类型 T 的指针,与指向 void 的指针不同,可以被解引用(这就是我们使用 *pointer 所做的),并在此过程中返回一个类型为 T 的对象。因此,如果您将指向一个 house 类型(指向一个 house)的指针转换为指向 castle 类型的指针,那么解引用转换后的指针将不会给您一个 castle 类型的对象,因为实际上指针仍然指向一个 house - Alexey Frunze
现在,结构体指针不仅可以解引用整个结构体,还可以进一步解引用单个结构体成员。因此,如果您有一个指向表示房屋部件的结构体的指针,则可以使用 -> 解引用它以获取这些部件,例如通过执行类似于 pointer->kitchen 的操作,这相当于 (*pointer).kitchen,即首先获取整个结构体,然后从中提取 kitchen - Alexey Frunze
显示剩余4条评论

4
将空指针转换为结构体类型的强制类型转换可以按以下方式进行。
void *vptr;
typedef struct data
{
   /* members */
} tdata;

对于这个问题,我们可以将其强制转换为结构体类型。假设您想要将该vptr作为结构体变量发送到某个函数,则如下:

然后:

void function (tdata *);
main ()
{
    /* here is your function which needs structure pointer 
       type casting void pointer to struct */
    
    function((tdata *) vptr);
}

注意:我们可以将void指针强制转换为任何类型,这是void指针的主要目的。

1
为什么这个被踩了?它提出了一些有效的观点(例如,“我们可以将void指针强制转换为任何类型”),并且回答了问题(虽然不是非常清楚)。 - Jacob Garby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接