gpt4 book ai didi

c - 将 2D 数组存储在 3D 数组中

转载 作者:行者123 更新时间:2023-11-30 15:06:26 25 4
gpt4 key购买 nike

我目前正在尝试为数据库请求编写回调函数。为每个结果/数据库条目/行调用该函数,我想将其二维数组(字符串数组/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] = dataset1

回调2:条目[0] = 数据集2,条目[1] = 数据集2

...

有什么想法吗?我仍在尝试学习“指针/数组二元论”和内存分配的概念,但对我来说最好的方法是实际操作。另外,我确实事先研究了很多理论,但我可能错过了一些东西。

编辑:添加了 cbCount++;

最佳答案

将评论转换为答案:

看起来 sqlite 重复使用了缓冲区,并且实际上在 argv vector 中为不同的调用传递了相同的指针。

因此,当您的 insertListEntries 第一次被调用时 (cbCount 0),参数 argv 可能包含指针值 { 0x1111100, 0x1111200 , 0x1111300, ... },将其复制到 entries[0] 数组中。

然后,当第二次调用 insertListEntries 时(cbCount 1),argv 中的指针值至少部分或有时相同!这意味着,为结果数据分配的缓冲区被重新使用,其内容发生了变化。因为您将指针复制到 entries[0],现在又将可能相同的指针复制到 entries[1],所以它们将指向相同的字符串,每个字符串都会被覆盖打电话。

解决方案是复制实际的字符串、实际的数据,而不是仅仅复制指向库内部缓冲区的指针。

关于c - 将 2D 数组存储在 3D 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38994447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com