我正在尝试构建一个字符数组来存储函数的返回值。在以下函数中,数据存储在 *****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; 
}

谢谢大家!

有帮助吗?

解决方案

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 功能。

其他提示

我只发现在谷歌一重击这一点,但它看起来像cr_sendfandreceive功能分配其rhnd-> reply.multibulk.bulks成员,所以你实际上并没有将它传递回来(因为你是在通过rhnd第1名)。

如果要复制它,那么你将宣布元件作为char **,并通过它的地址(或使用的参考文献),然后该方法内,你会克隆散货构件并且还阵列中的每个串(在一个循环)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top