2011-06-05 75 views
1

所以,我打算使用sqlite3來更新skype的main.db文件。奇怪的sqLite數據庫字符串文件路徑錯誤

我使用sqlite3_open函數來打開這樣的連接。

int rc = sqlite3_open(filepath,db); 

我想動態地做文件路徑字符串,但一個奇怪的錯誤讓我發瘋。

我有兩個字符串szFile和szFilePath,szFile是一個測試字符串,它將包含數據庫文件的實際路徑,而szFilePath是同一個字符串,只有這次是由函數動態生成的。

這個東西就在執行sqlite3_open函數之前,兩個字符串就像你在屏幕截圖上看到的一樣,我甚至會發布內存供你查看。

看圖片: Picture 1 Picture 2

現在,儘管是完全一致的,不管有多少次我運行此代碼只szFile工作,與其他一個給我一個「無法打開文件路徑」錯誤,並完全令我困惑。另外,如果這是正常的,我不會沒有,但通過在下一個設置斷點,我可以看到szFilePath丟失了它的值(用十六進制值填充)。

什麼可能是錯的?

回答

2

你返回一個char *指向數組堆棧上 - 只要你從函數返回szGetFilePath,這個指針很可能是指向垃圾(它肯定會指向垃圾一對夫婦後的額外調用級別 - 當堆棧中的值被覆蓋時)。

可以要麼返回炭從函數動態分配的數組(即malloc ED)(後來記得free它),或者通過將指針傳遞到一個char陣列szGetFilePath,把字符數據到這一點。

+0

那麼如何讓它指向堆上的數組呢? – 2011-06-05 18:12:49

+0

@Panayiotis - 回答修改給你幾個選項。 – 2011-06-05 18:16:27

+0

非常感謝!儘管我想知道如何通過動態分配來完成它,但我仍然設法讓它與第二個選項一起工作。 您是否會友善地給我一個關於如何使用malloc來做的代碼示例? – 2011-06-05 18:28:56

0

szGetFilePath返回一個局部變量(szPathAppData)的參考。從函數調用返回時,開始堆棧展開

char* szGetFilePath(char* szAccountName) 
{ 
    char *szPathAppData = calloc(128,1) ; // Allocating memory on heap 
    // .... 

    return szPathAppData ; 
} 

    // You need to free the resources acquired on heap by using free. 
    // free(szPathAppData) ; 
+0

非常感謝代碼!正是我在找:) – 2011-06-05 18:32:09

+0

@Mahesh如果szPathAppDate不存在函數範圍之外,我將如何釋放資源?我也遇到了一些令人討厭的堆異常。 – 2011-06-05 18:39:37

+0

@Panayiotis - 我不知道我是否正確理解你。你只是返回一個指向堆上位置的指針。你應該可以通過收集它的變量釋放它。順便說一下,'szPathAppData'指向的數據是否以null結束?('\ 0') – Mahesh 2011-06-05 18:46:26