使用sprintf时发生访问冲突

W酱 2012-05-28 12:24:07
调试程序发现运行到这一行就出错了:
sprintf(sql, "INSERT INTO Student VALUES(%s, %s, %s, %s, %s)", sno, sname, ssex, sage, sdept);
这里的sql声明是
char* sql;

char sql[100];
显示的错误信息是:
0x100720a7 (msvcr100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x0bfb7be7 时发生访问冲突
求助啊……调试半天还是没搞明白哪里出问题了。
...全文
453 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
W酱 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1,没分配内存
2,100够长?
3,sprintf(sql, "INSERT INTO Student VALUES('%s', '%s', '%s', '%s', '%s')", 4, mysql_real_escape_string(sno), mysql_real_escape_string(sname), mysql_real_escape_string(ssex), mysql_r……
[/Quote]

问题找到了……是因为sno和sage都是整型的……
我还有个新问题……以下这段代码的result怎么样才能不等于SQL_ERROR?我调试时发现result==-1了,但是我不知道为什么啊……
//Student表的插入函数
bool insertStudent(int sno, char* sname, char* ssex, int sage, char* sdept)
{
sprintf(sql, "INSERT INTO Student VALUES(%d, %s, %s, %d, %s)", sno, sname, ssex, sage, sdept);
result = SQLExecDirect(hStmt, (SQLTCHAR*)sql, SQL_NTS);
if (result == SQL_ERROR)
{
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
exit(0);
}
return true;
}
W酱 2012-05-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1,没分配内存
2,100够长?
3,sprintf(sql, "INSERT INTO Student VALUES('%s', '%s', '%s', '%s', '%s')", 4, mysql_real_escape_string(sno), mysql_real_escape_string(sname), mysql_real_escape_string(ssex), mysql_r……
[/Quote]

为什么%s要加单引号?百度到的用法里好像没有这个说明,我同学试过没用单引号也能运行成功T^T
tongzhipeng5699 2012-05-28
  • 打赏
  • 举报
回复
char* sql;这种是肯定不行的,因为sql是野指针,没有分配内存;
char sql[100]的话如果也错误的话,那就不明白了,看你那几个数据,分配也应该足够了..
莫非你的sname又用了野指针什么的....
最好把整个代码都贴出来吧,应该是proc吧,数据库没学几天,我可能看不懂,让其他人来解答吧。
W170532934 2012-05-28
  • 打赏
  • 举报
回复
一种可能就是楼主的代码里有没有分配内存却往指针所引用的内存区域写数据了。还有就是你的sql需要添加单引号的吧??如楼上说的:%s需要加单引号
jiuzhoulh 2012-05-28
  • 打赏
  • 举报
回复
2楼正解,%s需要加上单引号
qq120848369 2012-05-28
  • 打赏
  • 举报
回复
1,没分配内存
2,100够长?
3,snprintf(sql, "INSERT INTO Student VALUES('%s', '%s', '%s', '%s', '%s')", 4, mysql_real_escape_string(sno), mysql_real_escape_string(sname), mysql_real_escape_string(ssex), mysql_real_escape_string(sage), mysql_real_escape_string(sdept);
qq120848369 2012-05-28
  • 打赏
  • 举报
回复
1,没分配内存
2,100够长?
3,sprintf(sql, "INSERT INTO Student VALUES('%s', '%s', '%s', '%s', '%s')", 4, mysql_real_escape_string(sno), mysql_real_escape_string(sname), mysql_real_escape_string(ssex), mysql_real_escape_string(sage), mysql_real_escape_string(sdept);

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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