一个非常非常诡异的问题......==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比较却失败了

谁能帮忙解答一下么......我快要崩溃了......
...全文
420 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)
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充模块:用户可以通过添加银行卡再为自己进行充操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

69,394

社区成员

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

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