UB是否将C中的空指针与类型指针进行比较(相等)?

文本

我有一个类型化的指针,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)。一个问题比另一个问题早了不到一分钟(!),但是从第一个问题的注释来看,答案最初是错误的,并且仅在发布第二个问题之后才得到纠正。我接受哪一个?在这种情况下,是否有协议接受一个答案?

dbush

这种比较是明确定义的。

通过将avoid *与另一个指针类型进行比较时,另一个==指针将转换为void *

同样,C标准的6.5.9p6部分对以下与指针比较的内容进行了说明==

当且仅当两个都是空指针时两个指针比较相等,两个指针都是指向同一对象的指针(包括指向对象和其子对象开头的指针)或函数,两者都是指向同一数组最后一个元素的指针对象,或者一个是指向一个数组对象末尾的指针,另一个是指向另一个数组对象的起点的指针,而该数组对象恰好紧随地址空间中的第一个数组对象。

这里没有提及未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

相等的指针是否不同?

不同的指针是否相等?

与std :: vector的指针进行比较以检查相等性是否安全?

是否可以将指向对象的指针与nullptr进行比较?

空指针是否间接指向数组类型UB?

是否要求将指向两个不同的本地空对象的指针比较为不相等?

是否比较不在同一数组中的两个指针定义的相等性?

在C中是否可以将指针转换为双指针?

两个比较相等的指针是否转换为整数比较是否相等?

是否可以将函数指针与函数进行相等性比较?

如果将两个指针都转换为整数类型,是否将两个指针与<undefined行为进行比较?

指针比较在C中如何工作?比较不指向同一数组的指针是否可以?

UB是否将指针转换为空指针并对其进行写入?

禁止将指针与整数C ++进行比较

与C中的NULL指针比较

比较结构指针,丢弃成员和UB

C ++中的空指针之间的比较

类型的空指针中的成员访问,C编程是回文

将指向数组开头的指针与指向数组开头之前的相同类型的指针进行比较是否合法?

C ++比较不同类型的指针?

比较相同类型的指针是否安全?

对指针c ++的容器进行排序并比较类型

C中的空指针

解析:将PFObject与类中的指针进行比较

将指针与带有字符的指针进行比较?

比较 Python 中的 C 指针

c++中int类型的指针比较

可以比较 std::type_info 上的指针是否在常量表达式中相等?

如何正确地将 C 中任何类型的数据与指针进行比较并将类型转换为 char