gpt4 book ai didi

c - 在函数指针中自动转换 void* 参数

转载 作者:行者123 更新时间:2023-12-04 02:26:46 25 4
gpt4 key购买 nike

下面的代码工作正常,但是我想知道这是否是对 void* 与任何其他指针兼容的规则的有效使用

#include <stdio.h>

typedef struct {
int foo;
} SomeStruct_t;

typedef void(*SomeFunction_t)(void* ptr);

void bar(SomeStruct_t* str) {
printf("%d\n", str->foo);
}

void teddy(void* anyPtr) {
SomeStruct_t* str = (SomeStruct_t*)anyPtr;
printf("%d\n", str->foo);
}


int main()
{
SomeFunction_t functPtr = (SomeFunction_t)bar;
SomeStruct_t data = {.foo = 33};
functPtr(&data);

functPtr = teddy;
functPtr(&data);
return 0;
}

问题是,我应该使用 bar 还是 teddy 变体?我更喜欢 bar 但我不确定对于某些特殊情况这是否会导致难以检测的问题。

最佳答案

这是无效的:

SomeFunction_t functPtr = (SomeFunction_t)bar;

因为您将 void (*)(SomeStruct_t*) 类型的函数指针封装到类型 void (*)(void*) 并随后调用它类型转换类型。函数指针类型不兼容,因为参数不兼容。这会触发 undefined behavior .

虽然 SomeStruct_t * 可以转换为 void *,但转换不会发生,因为强制转换的函数指针阻止了它。无法保证 SomeStruct_t *void * 具有相同的表示。

使用与函数指针类型匹配的函数teddy 是安全的。此外,您不需要在函数内部将参数转换为 SomeStruct_t *,因为在大多数情况下不需要转换为 void *

关于c - 在函数指针中自动转换 void* 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67006203/

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