将结构传递给接受 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*
。在那种情况下,代码只会调用未定义的行为,以防指针不能表示为整数(这不太可能)。
我想调用一个类型为 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*
。在那种情况下,代码只会调用未定义的行为,以防指针不能表示为整数(这不太可能)。