【问题标题】:C++ How to use and pass a 3-dimensional char array?C++ 如何使用和传递一个 3 维字符数组?
【发布时间】: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; 
}

谢谢大家!

【问题讨论】:

标签: c++ multidimensional-array redis


【解决方案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]);返回结果; }
猜你喜欢
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2014-04-05
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多