Visual Studio 2017中if语句判定疑问:指针未指向同一位置却为true
关于指针判定意外为true的常见原因分析
嘿,这个问题我之前也碰到过类似的情况,咱们一步步拆解来看~结合Visual Studio 2017的场景,大概率是下面几种情况导致的:
指针被隐式转换为布尔值
如果你的if语句直接写了if (ptr)这类形式,那只要指针不是NULL(或nullptr),不管它指向哪个内存地址,都会被C++隐式转换成布尔值true。举个例子:int* ptr1 = new int(5); int* ptr2 = new int(10); if (ptr1) { // 只要ptr1不是空指针,就会返回true,和ptr2的地址无关 // 执行逻辑 }这是C++类型转换的默认规则,非空指针都会被视为“真”。
手滑写错了比较运算符
最容易犯的低级错误:把比较用的==写成了赋值用的=。比如:int* ptr1 = &a; int* ptr2 = &b; if (ptr1 = ptr2) { // 这里是把ptr2的地址赋值给ptr1,然后判断赋值后的ptr2是否非空——只要ptr2不是空指针,结果就是true // 执行逻辑 }这种情况编译器通常只会给警告,不会直接报错,很容易被忽略。
编译器优化导致的指针合并
在Visual Studio 2017的高优化等级(比如O2)下,编译器可能会对代码做激进优化:如果它判断两个指针指向的内存区域不会被修改,或者逻辑上等价,可能会直接把指针比较的结果设为true。你可以试试把优化等级改成O0(禁用优化)再测试,看看结果是否变化。混淆了指针本身和指针指向的内容
如果你比较的不是指针地址,而是指针解引用后的内容,那即使指针地址不同,只要内容相同,结果也会是true。比如:int a = 10; int b = 10; int* ptr1 = &a; int* ptr2 = &b; if (*ptr1 == *ptr2) { // 这里比较的是a和b的值,不是指针地址,所以结果为true // 执行逻辑 }这种情况是把
ptr(指针地址)和*ptr(指针指向的值)搞混了,需要注意区分。
如果能提供具体的代码片段,就能更精准地定位问题啦,但上面这几种是最常见的诱因,你可以对照着排查一下。
内容的提问来源于stack exchange,提问作者RAVINDER KUMAR Patel
相关产品推荐
相关产品推荐

