首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C上的常量字符哪个变量相同,但参数值不同

C上的常量字符哪个变量相同,但参数值不同
EN

Stack Overflow用户
提问于 2012-08-31 17:51:18
回答 2查看 138关注 0票数 2

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

代码语言:javascript
复制
const char *query="SELECT * FROM myTable;";
printf("%s\n",query);
state=mysql_query(sock,query);
printf("%s\n",query);

在该代码中,'state‘语句前后的查询值相同(SELECT * from myTable;)。但是对于这段代码:

代码语言:javascript
复制
const char *query=getQuery();
printf("%s\n",query);
state=mysql_query(sock,query);
printf("%s\n",query);

函数:

代码语言:javascript
复制
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)。

有人知道吗?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-31 18:39:18

问题是你返回的是一个局部变量。执行函数getQuery()后,q将消失,返回的指针u指向无效内存并读取乱码。它在查询之前工作而不是在查询之后工作的原因是因为数据还没有被覆盖。

你想要的是像这样的东西

代码语言:javascript
复制
char *returnvalue = (char *) malloc(sizeof(char)*BUFSIZ);
char q[BUFSIZ];
sprintf_s(q,"%s","SELECT * FROM myTable;");
memcpy(returnvalue, q, BUFSIZ);
return returnvalue;

或者这个

代码语言:javascript
复制
char *returnvalue = (char *) malloc(sizeof(char)*BUFSIZ);
sprintf_s(returnvalue ,"%s","SELECT * FROM myTable;");
return returnvalue;

在查询之后,你必须记得释放分配的内存。

代码语言:javascript
复制
free(query);
票数 4
EN

Stack Overflow用户

发布于 2012-08-31 18:50:20

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

局部字符数组q在getQuery的末尾离开作用域。这意味着它占用的内存被释放。不幸的是,returnValue仍然指向那个内存位置。

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12212930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档