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 维字符数组?的主要内容,如果未能解决你的问题,请参考以下文章

C++函数如何传递字符串?

c++如何确认数组的元素为空

C语言中如何将二维字符数组作为函数参数引用传递

在 C++ 中重新分配 3 维数组

C++ 数组与字符串⁽²³⁾|函数与数组

c++的问题: 字符串如何转bool型