2

我有程序使用 c 和 c++ 语言来访问 MySQL 数据库中的数据。代码:

const char *query="SELECT * FROM myTable;";
printf("%s\n",query);
state=mysql_query(sock,query);
printf("%s\n",query);

从该代码中,“状态”语句之前和之后的查询值相同(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)。

有人知道吗?

提前致谢。

4

2 回答 2

4

问题是您正在返回一个局部变量。函数 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-31T10:39:17.873 回答
0

我认为这就是正在发生的事情:

本地 char 数组 q 在 getQuery 结束时离开作用域。这意味着它占用的内存被释放。不幸的是 returnValue 仍然指向那个内存位置。

释放的内存不会立即被覆盖。它被标记为“空闲”,并在需要该内存时重新分配。这就是为什么第一次调用 printf 仍然有效的原因:内存还不需要,所以旧数据仍然存在。但是 mysql_query 函数很可能需要一些内存,并且使用了曾经分配给 q 的内存。所以你现在在查询指向的地址中拥有的是来自 mysql_query 函数的一些随机数据。

那么如何解决这个问题呢?

使用 malloc() 或 new 为 returnValue 分配内存,然后使用 strncopy 将 q 的内容复制到 returnValue。请记住,当调用程序完成查询字符串时,它必须是 free()'ed 或 delete'd。

于 2012-08-31T10:50:19.777 回答