c - UB 是否将 void 指针与 C 中的类型化指针进行比较(是否相等)?
问题描述
我有一个类型化的指针,typed
它是使用指针算法初始化的,以指向数组中的一个对象。我还有一个函数,它需要两个指针参数,第一个类型与上述指针相同,第二个是void *
(参见myfunc()
下面的代码)。
typed
如果我作为第一个参数传递,另一个指针类型typed
与第二个参数相同,然后在函数内比较它们是否相等,那是未定义的行为吗?
#include <stdio.h>
typedef struct S {int i; float f;} s;
void myfunc(s * a, void * b)
{
if (a == b) // <-------------------------------- is this UB?
printf("the same\n");
}
int main()
{
s myarray[] = {{7, 7.0}, {3, 3.0}};
s * typed = myarray + 1;
myfunc(typed, &(myarray[0]));
return 0;
}
更新:好的,所以我在上面发布我的问题后一天回来,有两个很好的答案(感谢@SouravGhosh 和@dbush)。一个比另一个早了不到一分钟(!),但从第一个评论的外观来看,答案最初是错误的,只有在第二个答案发布后才更正。我接受哪一个?在这种情况下,是否有一种协议可以接受一个答案而不是另一个答案?
解决方案
不,这不是未定义的行为。这是在等式运算符约束的规范中允许并明确定义的。引用C11
,第 6.5.9 章
一个操作数是指向对象类型的指针,另一个是指向 void 的限定或非限定版本的指针;
以及同一章的第 5 段
[...] 如果一个操作数是指向对象类型的指针,而另一个是指向 void 的限定或非限定版本的指针,则前者将转换为后者的类型。
推荐阅读
- css - 如何制作响应式滚动容器?
- python - How can I overload the __repr__ method to display all items in a linked list Stack?
- python - Pandas 在其他列约束下找到最小化列总和的行子集
- graph - 一个关于PPG(进程优先图)的问题,能不能解释下为什么下图是错误的
- ios - 从 Django 后端推送通知到 iOS/Swift 前端
- wordpress - 无法从服务器加载 admin-ajax
- r - 删除R中每个像素的时间序列栅格中的异常值
- reactjs - 与 useCallback 不一致的 linter 警告
- python - 在不上采样 1 分钟的情况下合并 1 分钟、5 分钟和每日 OHLC 数据帧?
- javascript - 如何覆盖从javascript中的模块返回的类中的函数