【发布时间】:2018-10-28 16:43:45
【问题描述】:
受到 cmets 对我的回答 here 的启发。
此步骤顺序在 C 标准 (C11) 中是否合法?
- 创建一个函数指针数组
- 获取指向第一个条目的指针并将 指向函数指针的指针转换为
void* - 对该
void*执行指针运算 - 将其转换回指向函数指针的指针并取消引用它。
或等效为代码:
void foo(void) { ... }
void bar(void) { ... }
typedef void (*voidfunc)(void);
voidfunc array[] = {foo, bar}; // Step 1
void *ptr1 = array; // Step 2
void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3
voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4
我认为这是允许的,因为实际的函数指针只能通过正确类型的指针访问。但 Andrew Henle 指出 Standard section 6.3.2.3: Pointers 似乎没有涵盖这一点。
【问题讨论】:
-
这种混淆似乎是典型的类型定义指针。甚至到函数。将您的代码与
typedef void voidfunc(void); voidfunc* array[] = ...;进行对比应该可以准确指出可能存在混淆的地方。 -
@StoryTeller 嗯,很好,我不知道你可以 typedef 函数类型。确实比在 typedef 中隐藏
*更清晰。
标签: c language-lawyer function-pointers c11 pointer-arithmetic