比较两种不同类型的指针

时间:2017-11-10 19:42:06

标签: c pointers types compare

在C编程中,比较两种不同类型的指针:

int i = 1;
double d = 2.5;

int *ip = &i;
double *dp = &d;

if(ip != dp) // is it UB?
    printf("Not same\n");

C中是否有ip != dp未定义的行为?

3 个答案:

答案 0 :(得分:6)

直接比较ip != dp在C中无效。!=运算符的规范不允许在一次比较中混合int *double *指针。它是C中的约束违规(又称“编译错误”)。符合标准的C编译器会通过发出诊断消息将您的代码报告为无效。

接下来发生的事情完全取决于您的编译器。它与C语言无关。

将此代码称为“产生未定义行为的C代码”会产生误导。这是正式的,但它与说“War and Piece”的文本是“产生未定义行为的C代码”(在一些接受它的奇怪C编译器中)完全一样。

这里的关键点是这种代码语言约束意味着它根本不是C代码。

答案 1 :(得分:2)

这是定义良好。 !=运算符的先决条件是,如果两个操作数都是指针,则它们必须是兼容类型。 intdouble不兼容。

来自C standard的第6.5.9节:

  

2 以下其中一项应成立:

     

- 两个操作数都有算术类型;

     

- 两个操作数都是指向合格或非限定版本的指针   兼容类型;

     

- 一个操作数是指向对象类型的指针,另一个是a   指向合格或不合格版本的void;或

     

- 一个操作数是指针,另一个是空指针常量。

答案 2 :(得分:0)

是的,此操作未定义,Kernighan& Ritchie在他们的着作" The C Programming Language":

中被提及
  

任何指针都可以有意义地比较等于或不等于零。但是对于算术或与不指向同一数组成员的指针进行比较的行为是未定义的。

这意味着无法检查指向不同类型的指针是否相等。