我有一个类型化的指针,typed
它是使用指针算法初始化的,以指向数组内的对象。我还有一个函数需要两个指针args,第一个与前面提到的指针相同,第二个是args 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)。一个问题比另一个问题早了不到一分钟(!),但是从第一个问题的注释来看,答案最初是错误的,并且仅在发布第二个问题之后才得到纠正。我接受哪一个?在这种情况下,是否有协议接受一个答案?
这种比较是明确定义的。
通过将avoid *
与另一个指针类型进行比较时,另一个==
指针将转换为void *
。
同样,C标准的6.5.9p6部分对以下与指针比较的内容进行了说明==
:
当且仅当两个都是空指针时两个指针比较相等,两个指针都是指向同一对象的指针(包括指向对象和其子对象开头的指针)或函数,两者都是指向同一数组最后一个元素的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的起点的指针,而该数组对象恰好紧随地址空间中的第一个数组对象。
这里没有提及未定义的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句