将结构传递给接受 void * 参数的函数的问题

Issue in passing a structure to a function accepting void * parameter

我想调用一个类型为 foo(void * data) 的函数,其输入参数是一个结构变量。

我听说当输入格式是void类型时,它接受所有类型的输入变量类型。然而,我收到一条错误消息。

struct info{
    int element;
};

struct info inserter_info;
inserter_info.element = 0;

inserter(inserter_info);

其中 inserter() 的原型为 void * inserter(void * data)

我试过投射,但后来也收到了错误消息。

I have heard that when the input format is of type void, it accepts every type of input variable type

绝对错误!!! void 表示 没有 什么都不接受

但是,void * 被认为是 通用指针。引用 C11 标准文档,第 6.3.2.3 章,指针,段落 1,

A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer.

多次使用这个属性,函数参数写成void *这样,函数可以接受不同类型的指针,然后在函数体内部,基于其他一些参数,接收指针在使用之前被转换(转换)回实际的指针类型。

如果检查正确,函数的参数不是void,而是void *

你需要像这样调用你的函数

inserter(&inserter_info);

P.S - 你的编译器应该警告你不匹配。

void *data 需要一个指针

这里:

struct info inserter_info;
inserter_info.element = 0;
inserter(inserter_info);

您没有传递指针,更改为:

inserter(&inserter_info);

它需要一个指针,但你没有传递一个指针,如果 inserter() 函数要在不同的线程中 运行 你需要在堆上分配结构,否则它将在线程启动时释放。

struct info {
    int element;
};

struct info *inserter_info;
inserter_info = malloc(sizeof(*inserter_info));
if (inserter_info == NULL)
    abortThisOperation();
inserter_info->element = 0;

inserter(inserter_info);

你应该确保当线程完成工作时你将释放分配的指针。

如果函数不打算从不同的线程运行然后像这样传递结构的地址

struct info inserter_info;
inserter_info.element = 0;

inserter(&inserter_info);

就够了。

I have heard that when the input format is of type void, it accepts every type of input variable type

指向 void 的 指针 接受任何其他指向 对象类型 的指针。 void* 和指向 函数类型 的指针之间的转换是未定义的行为,它不在标准中。

标准仍然将其列为 "common language extension",这意味着此类转换在您给定的系统上可能没问题,但前提是您的编译器已实现非标准扩展。

实际上,指针几乎总是直接对应于原始 CPU 地址,在这种情况下,变量地址和函数地址之间通常没有区别。所以在 C 标准之外的现实世界中,你可能会逃脱这样的强制转换。

否则,您可以 "hack the C standard" 首先将函数指针转换为整数类型(例如 uintptr_t),然后从那里将其转换为 void*。在那种情况下,代码只会调用未定义的行为,以防指针不能表示为整数(这不太可能)。