2

我正在尝试构建一个 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; 
}

谢谢大家!

4

2 回答 2

5
char ***element[size];

不完全是一个 3D 数组,而是一个size指针到指针的元素数组char

使用以下任何一种:

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函数。

于 2010-02-02T23:29:52.953 回答
0

我只在谷歌上找到了一个命中,但看起来 cr_sendfandreceive 函数分配了它的 rhnd->reply.multibulk.bulks 成员,所以你实际上不必把它传回去(因为你首先被传给了 rhnd )。

如果要复制它,则将元素声明为 char** 并传递其地址(或使用引用),然后在方法内部克隆 bulks 成员以及数组中的每个字符串(在循环中) .

于 2010-02-02T23:54:16.570 回答