我用c和c++语言编写了程序来访问MySQL数据库中的数据。代码:
const char *query="SELECT * FROM myTable;";
printf("%s\n",query);
state=mysql_query(sock,query);
printf("%s\n",query);在该代码中,'state‘语句前后的查询值相同(SELECT * from myTable;)。但是对于这段代码:
const char *query=getQuery();
printf("%s\n",query);
state=mysql_query(sock,query);
printf("%s\n",query);函数:
const char * getQuery(){
const char *returnValue;
char q[BUFSIZ];
sprintf_s(q,"%s","SELECT * FROM myTable;");
returnValue=q;
return returnValue;
}从这段代码中,"state“语句之前和之后的查询值不同,之前(SELECT * from myTable;)和之后(1/4>-uC^M)。
有人知道吗?
提前谢谢。
发布于 2012-08-31 18:39:18
问题是你返回的是一个局部变量。执行函数getQuery()后,q将消失,返回的指针u指向无效内存并读取乱码。它在查询之前工作而不是在查询之后工作的原因是因为数据还没有被覆盖。
你想要的是像这样的东西
char *returnvalue = (char *) malloc(sizeof(char)*BUFSIZ);
char q[BUFSIZ];
sprintf_s(q,"%s","SELECT * FROM myTable;");
memcpy(returnvalue, q, BUFSIZ);
return returnvalue;或者这个
char *returnvalue = (char *) malloc(sizeof(char)*BUFSIZ);
sprintf_s(returnvalue ,"%s","SELECT * FROM myTable;");
return returnvalue;在查询之后,你必须记得释放分配的内存。
free(query);发布于 2012-08-31 18:50:20
我认为这就是正在发生的事情:
局部字符数组q在getQuery的末尾离开作用域。这意味着它占用的内存被释放。不幸的是,returnValue仍然指向那个内存位置。
释放的内存不会立即被覆盖。它被标记为“空闲”,并在需要该内存时重新分配。这就是对printf的第一个调用仍然有效的原因:不需要内存,所以旧数据仍然在那里。但是mysql_query函数很可能需要一些内存,并且使用了曾经为Q分配的内存。因此,在查询指向的地址中,您现在拥有的是来自mysql_query函数的一些随机数据。
那么,如何解决这个问题呢?
使用malloc()或returnValue为新分配内存,然后使用strncopy将q的内容复制到returnValue。只需记住,当#调用程序使用完查询字符串时,查询字符串必须是free()或delete'd。
https://stackoverflow.com/questions/12212930
复制相似问题