2

MySQLデータベースのデータにアクセスするためにcおよびc++言語を使用するプログラムがあります。コード:

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"ステートメントの前後のクエリ値は同じではありません。before(SELECT * FROM myTable;)とafter(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に割り当てられたメモリが使用されます。したがって、queryが指すアドレスに現在あるのは、mysql_query関数からのランダムデータです。

では、これをどのように修正できますか?

malloc()またはnewを使用してreturnValueのメモリを割り当て、次にstrncopyを使用してqの内容をreturnValueにコピーします。クエリ文字列は、呼び出し元のプログラムが終了したときに#free()または削除する必要があることに注意してください。

于 2012-08-31T10:50:19.777 に答える