一个非常非常诡异的问题......==NULL判定为假但是值却是NULL

N0TEAR 2011-05-01 09:04:25
关键代码如下:

else
{
printf("[%s] made...\n", query); // LOG
res = mysql_store_result(conn);
if (res == NULL)
{
printf("db res error: %s\n", mysql_error(conn)); // LOG
return 1;
}
}
return 0;


gdb调试信息如下:
(gdb) next
34 if (res == NULL)
(gdb) print res
$12 = (MYSQL_RES *) 0x0
(gdb) print *res
Cannot access memory at address 0x0
(gdb) next
40 return 0;
(gdb) print res
$13 = (MYSQL_RES *) 0x0

从调试信息很明显可以发现res的值为0但是==NULL比较却失败了

谁能帮忙解答一下么......我快要崩溃了......
...全文
418 36 打赏 收藏 转发到动态 举报
写回复
用AI写文章
36 条回复
切换为时间正序
请发表友善的回复…
发表回复
N0TEAR 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 lactoferrin 的回复:]
那你把xxx->去掉干什么,光是一个res让人以为res就是栈中的局部变量,谁也不会想到是xxx的问题
[/Quote]

......好吧,以后我会贴出完整函数的......
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
那你把xxx->去掉干什么,光是一个res让人以为res就是栈中的局部变量,谁也不会想到是xxx的问题
N0TEAR 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 lactoferrin 的回复:]

本来是xxx->res?
[/Quote]

是滴,就是那个xxx被我不小心提前free掉了......
Lactoferrin 2011-05-06
  • 打赏
  • 举报
回复
本来是xxx->res?
N0TEAR 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 lactoferrin 的回复:]

引用 28 楼 n0tear 的回复:

引用 23 楼 redred82 的回复:
这种情况是可能存在的,就是某个地方出现了野指针,比这更诡异的情况我也碰过。
由于内存混乱,很多不合理的情况都可能出现。楼主可能要细查整个程序了,而不仅仅出现问题那里。


恭喜你部分答对了......虽然第二天早上我就靠自己发现问题原因了但是我还是会给你30分^_^剩下10分给其他出主意的同学~
……
[/Quote]

res是一个结构体里的一个成员,类型是指针,怎么定义的重要么?
N0TEAR 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 taodm 的回复:]
用打印语言,别太相信调试器。
[/Quote]

请参考我28楼的回复......
N0TEAR 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shujuhuifu802 的回复:]
有没有可能是数据类型不同导致?试试sizeof 或强制类型转换能否成功?
[/Quote]

请参考我28楼的回复......
N0TEAR 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 redred82 的回复:]
这种情况是可能存在的,就是某个地方出现了野指针,比这更诡异的情况我也碰过。
由于内存混乱,很多不合理的情况都可能出现。楼主可能要细查整个程序了,而不仅仅出现问题那里。
[/Quote]

恭喜你部分答对了......虽然第二天早上我就靠自己发现问题原因了但是我还是会给你30分^_^剩下10分给其他出主意的同学~
原因是因为这个res属于某个我malloc出来但不小心提前free了的结构体,所以res的确成了野指针的一部分,所以它的值会随着内存刷新而一直不断地在变......换句话说就是它本身包括它的值都是没有意义的......唉,就当是给自己也给其他人一个教训了......
Lactoferrin 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 n0tear 的回复:]

引用 23 楼 redred82 的回复:
这种情况是可能存在的,就是某个地方出现了野指针,比这更诡异的情况我也碰过。
由于内存混乱,很多不合理的情况都可能出现。楼主可能要细查整个程序了,而不仅仅出现问题那里。


恭喜你部分答对了......虽然第二天早上我就靠自己发现问题原因了但是我还是会给你30分^_^剩下10分给其他出主意的同学~
原因是因为这个res属于某个我malloc出……
[/Quote]
你res的定义是什么
子达如何 2011-05-04
  • 打赏
  • 举报
回复
强烈要求rebuild!被Debugger捉弄无数次之后的总结:)
就想叫yoko 2011-05-04
  • 打赏
  • 举报
回复
++[Quote=引用 14 楼 hqin6 的回复:]

重编一下试试,怀疑代码和可执行文件不同步。。。
[/Quote]
hzc543806053 2011-05-04
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

void main()
{
int n;
scanf("%d",&n);
fflush(stdin);
char * line = (char *)malloc( sizeof( char ) * n);
gets(line);
printf("%s",line);
free(line);
}
hzc543806053 2011-05-04
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>

void main()
{
int n;
scanf("%d",&n);
fflush(stdin);
char * line = (char *)malloc( sizeof( char ) * n);
gets(line);
printf("%s",line);
free(line);
}
redred82 2011-05-04
  • 打赏
  • 举报
回复
这种情况是可能存在的,就是某个地方出现了野指针,比这更诡异的情况我也碰过。
由于内存混乱,很多不合理的情况都可能出现。楼主可能要细查整个程序了,而不仅仅出现问题那里。
ericming200409 2011-05-04
  • 打赏
  • 举报
回复
NULL的值不一定为0
thelover 2011-05-03
  • 打赏
  • 举报
回复
#include <stdio.h>
luciferisnotsatan 2011-05-03
  • 打赏
  • 举报
回复
查查看,这个NULL是不是没有被定义成0x0?
最简单的方法
int x = NULL; 看看x值是多少
满衣兄 2011-05-03
  • 打赏
  • 举报
回复
你看看NULL是怎么定义的 ,是 #define NULL 0 吗
赵4老师 2011-05-03
  • 打赏
  • 举报
回复
在res上设置值改变断点。
DontKissBossAss 2011-05-03
  • 打赏
  • 举报
回复
res的值被修改了,或者打印信息不准。。。
加载更多回复(15)

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧