C++ 如何使用和传递一个 3 维字符数组?
Posted
技术标签:
【中文标题】C++ 如何使用和传递一个 3 维字符数组?【英文标题】:C++ How to use and pass a 3-dimensional char array? 【发布时间】:2011-01-12 09:54:19 【问题描述】:我正在尝试构建一个 char 数组来存储函数的返回值。在以下函数中,数据存储在 *****valv** 中。如何构建外部变量来访问数据?
int credis_lrange(REDIS rhnd, const char *key,
int start, int end, char ***valv)
int rc;
if ((rc = cr_sendfandreceive(rhnd, CR_MULTIBULK, "LRANGE %s %d %d\r\n",
key, start, end)) == 0)
*valv = rhnd->reply.multibulk.bulks;
rc = rhnd->reply.multibulk.len;
return rc;
解决方案:
char **elements;
int size = credis_lrange(this->redis,"object_2",600,603,&elements);
for (int i=0; i<size;i++)
cout << "element: " << elements[i] << endl;
谢谢大家!
【问题讨论】:
许多重复项。以***.com/questions/917783/…***.com/questions/1874604/…***.com/questions/2003745/…开头,还有其他... 并不是说它直接回答了你的问题,而是数组在 C++ 中是“非首选”的,你应该使用 STL 容器类,可能是向量。 credis 库是一个 C 库。我可以在 C 中使用 C++ 向量吗? 没有任何可靠的方式...如果您了解std::vector
是如何在该编译器/机器/库组合上实现的,理论上您可以做一些事情,但这是不值得的。
【参考方案1】:
char ***element[size];
不完全是 3D 数组,而是指向 char
的指针的指针的 size
元素的数组。
使用以下任意一种:
char e[ D1 ][ D2 ][ D3 ]; /* D1, D2, D3 are integral constants */
char *e[ D2 ][ D3 ];
char e[][ D2 ][ D3 ];
此外,您可以通过简单地将 e
指定为函数的参数来传递它。
进一步阅读,该参数似乎不是真正的 3D 数组,而是指向 C 样式字符串数组的指针。注意,语法可能相同,意图不同。
在这种情况下,您需要做两件事:
指定要存储在数组中的字符串数 对于每个字符串 分配内存 将字符串数据复制到char
数组中
最后,您将把这个字符串数组的地址传递给credis_lrange
函数。
【讨论】:
嗨,Dirk,感谢您的超快速回复。所以我必须制作 3 个 for 循环并为每个数组级别的每个元素分配内存? 如果你使用 Dirks first 的建议,你不需要做任何内存分配。所有这些都分配在一个连续的块中。虽然当你使用“e”时,它的行为很像一个指针(指向一个指向 char 的指针),但这并不意味着需要从堆中分配/释放内存。 在 Dirk 的第一个示例中,您不需要分配内存。在第二个示例中,您需要循环一次并分配内存。 我已经尝试过 Dirks 的第一个建议,但收到此错误:无法将参数 '5 的 'char ()[1024][1024]' 转换为 'char**' ' to 'int credis_lrange(_cr_redis*, const char*, int, int, char***)' @dirk:再次感谢您的帮助。我遇到了几乎相同的错误:无法将 'char ( * )[1024][1024][1024]' 转换为 'char***' for argument '5' to 'int credis_lrange(_cr_redis*, const char*, int, int, char***)'【参考方案2】:我只在谷歌上找到了一个命中,但看起来 cr_sendfandreceive 函数分配了它的 rhnd->reply.multibulk.bulks 成员,所以你实际上不必把它传回去(因为你被传入了 rhnd第一名)。
如果你想复制它,那么你可以将元素声明为 char** 并传递它的地址(或使用引用),然后在方法内部克隆块成员以及数组中的每个字符串(在一个循环)。
【讨论】:
嗨,尼尔,感谢您的回复。你能给出任何示例代码吗? 这是基本思路,但显然没有任何错误检查: char** clone(int argc, char argv) char result = (char**)malloc( argc * sizeof(char*)); while (argc--) 结果[argc] = strdup(argv[argc]);返回结果;以上是关于C++ 如何使用和传递一个 3 维字符数组?的主要内容,如果未能解决你的问题,请参考以下文章