2012-08-31 24 views
2

我有程序使用c和C++語言來訪問MySQL數據庫中的數據。 的代碼:c上的const char相同的變量但差異值

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; 
} 

從這個代碼,查詢值從之前和之後的 「狀態」 的聲明是不一樣的,前(SELECT * FROM mytable的)和後(1/4> -Uc^M)。

有人知道嗎?

在此先感謝。

+0

該函數從mysql庫中執行到執行mysql的查詢。 – titia

+0

我不知道到底發生了什麼事。 但從我的第一個代碼顯示,mysql_query()不會更改查詢。 – titia

+0

你確定getQuery不會執行const char [] returnvalue =「SELECT * FROM myTable;」' 這會顯示你所看到的很多東西。 –

回答

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; 

你必須記住要somewere釋放所分配的內存中查詢後。

free(query); 
+0

可能是一個好主意,要注意查詢的內存需要在某個時候釋放。 – jszakmeister

+0

好點,編輯 – Minion91

+0

@ Minion91:謝謝,這是指針造成的。 – titia

0

我認爲這是發生了什麼:

本地字符陣問:葉範圍在getQuery結束。這意味着它所佔用的內存被釋放。不幸的是,returnValue仍然指向那個內存位置。

取消分配的內存不會立即被覆蓋。它被標記爲「空閒」,並在需要內存時重新分配。這就是爲什麼第一次調用printf仍然有效:內存不再需要,所以舊數據仍然存在。但是mysql_query函數很可能需要一些內存,並且使用曾經爲q分配的內存。所以你現在在查詢指向的地址中有什麼是來自mysql_query函數的一些隨機數據。

那麼如何解決這個問題?

使用malloc()或new分配內存爲returnValue,然後使用strncopy將q的內容複製到returnValue。請記住,當調用程序結束時,查詢字符串必須爲空(),否則刪除。

+0

謝謝。你是對的。 – titia