簡體   English   中英

在3D陣列中存儲2D陣列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM