错误C2446:' ==' :没有来自' int *'到' int'

时间:2017-04-11 15:52:49

标签: c pointers

我想将数字与地址进行比较。 这是代码。

#include "stdio.h"
int main (void) {
    int a = 1;
    printf("%#x\n", &a);  // The address of a is 0x18ff44
    int  b = 0x18ff44;
    if (b == &a) {        //error
       printf("no\n"); 
    }
    return 0;
}

我想知道我是否可以将号码与地址进行比较。

错误:错误C2446:' ==' :没有来自' int *'到' int'

我做了一些研究,我有两个假设:

  • 可能因为不同的数据类型无法进行比较。

    但是我尝试将float的数据类型与char进行比较,并且代码被认可是正确的。

  • 我了解了MSDN的编译器错误c2446。翻译是"编译器无法将type1转换为type2。 "

我的假设是,当执行关系操作时,编译器需要将type1转换为type2。但转换为' int *'到' int'没有意义。 我的问题:这个假设是否正确?如果不是,为什么会发生这种情况?

编译器信息:从https://www.microsoft.com

下载的VC 6.0

3 个答案:

答案 0 :(得分:1)

bint)的类型不兼容,表达式&aint *)的类型。修复很简单 - 将b声明为int *

int *b = (int *) 0x18ff44; // literal will have integral, non-pointer type,
...                        // so the cast is necessary
if ( b == &a )  // int * == int *
{
  ...
}

现在表达式具有兼容的类型,错误将消失。

打印指针值,请使用%p转换说明符,如下所示:

printf( "&a = %p\n", (void *) &a );

这是C中极少数(如果不是唯一的)地方之一,需要施放void *

修改

要回答较大的问题,为什么 intint *不兼容?

int数据类型是签名类型,只有保证才能表示[-32767,32767]范围内的值。它可能能够表示更广泛的值(并且在大多数现代实现中,它通常[-232, 232-1]),但它可能或可能不能表示所有可能的指针值。指针值可以转换为int值,反之亦然,但结果不能保证有意义或定义明确。

指针类型的表示基本上取决于实现,并且该表示甚至可能不是标量值。对于不同的指针类型,它甚至可能不同(尽管void *char *必须具有相同的表示和对齐)。因此,int和指针类型之间的直接比较可能没有意义。实现可以使用相同的字大小和表示,但由于不能保证这种情况,语言要求类型不兼容。

答案 1 :(得分:0)

这似乎有效:

 public class Salary
    {
       protected Integer id;
       protected Boolean simulated;
       protected Double salary;

    }

public class Simulation extends Salary
{
 //you do not need Integer id here
 private Double simulatedSalary;
 private Double notsimulatedSalary;
 private Double totalSalary;
}

编辑:为了64位系统的通用性,请使用:

#include "stdio.h"
int main (void) {
    int a = 1;
    printf("%p\n", &a);  // The address of a is 0x18ff44
    int  b = 0x18ff44;
    if (b == (int) &a) {        //no error
       printf("no\n"); 
    }
    return 0;
}

答案 2 :(得分:0)

是的,您可以将变量与地址进行比较,但这非常危险。

首先,您的代码使用gcc版本4.6.3正确编译。所以我假设编译器错误与MSVC有关,肯定会被禁用。

尽管如此,

地址类型为size_t,可以(通常)为32或64,具体取决于您的计算机和构建环境。另一方面,整数可能小于size_t,不足以解决整个RAM!

所以我建议你使用size_t而不是int(或将你的整数和指针转换为size_t),然后比较它们,我认为这是最安全的,因为我们真正比较两个内存更有意义指针类型而不是整数和浮点数。

我会做这样的事情:

size_t a_adr = (size_t)&a;
size_t b_adr = (size_t)&b;

if (a_adr == b_adr)
   ..

在处理我朋友的指针时要小心。