[英]Storing 2D arrays in 3D array
我目前正在嘗試為數據庫請求編寫回調函數。 每個結果/數據庫條目/行都會調用該函數,我想將其2D數組(字符串/ char *數組)存儲在數組中。 我當前的解決方案如下所示:
全局聲明:
char ***entries;
在設置功能中為第一維分配內存:
entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(char **)*200);
我正在使用Windows API / Win32,基本上它是malloc,內存為零,最后一個參數引用大小。
初始化回調計數並注冊數據庫執行的回調函數:
cbCount = 0;
rc = sqlite3_exec(db, sql, insertListEntries, 0, &zErrMsg);
回調函數:
static int insertListEntries(void *NotUsed, int argc, char **argv, char **azColName) {
entries[cbCount] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(argv)*argc);
memcpy(entries[cbCount], argv, sizeof(argv)*argc);
...
cbCount++;
}
參數:argc是數據的argv /列的大小,而argv是具有行數據的字符串數組。 我只是將argv的內存數據復制到3D數組中。
但是,現在的問題是,對於每個回調,所有以前的數據集都會被當前結果覆蓋,如下所示:
回調1:條目[0] =數據集1
回調2:條目[0] =數據集2,條目[1] =數據集2
...
有任何想法嗎? 我仍在嘗試學習“指針/數組二元論”和內存分配的概念,但對我而言,最好的方法是實際進行操作。 另外,我還預先研究了很多理論,但是我可能錯過了一些東西。
編輯 :添加了cbCount ++;
將評論轉換為答案:
看起來sqlite重用了緩沖區,實際上在argv
向量中為不同的調用傳遞了相同的指針。
所以,當你的insertListEntries
被稱為第一次( cbCount
0),參數argv
可能包含指針值{ 0x1111100, 0x1111200, 0x1111300, ... }
您復制到您的entries[0]
數組。
然后,當insertListEntries
被稱為第二時間( cbCount
1),在指針值argv
至少部分地或有時相同! 這意味着分配給結果數據的緩沖區將被重新使用,其內容也會更改。 因為您將指針復制到entries[0]
,現在將可能相同的指針復制到entries[1]
,所以它們將指向相同的字符串,每次調用都會覆蓋它們。
解決方案是復制實際的字符串,實際的數據,而不是僅將指針復制到庫的內部緩沖區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.