C矢量作为char ***矢量

时间:2010-09-24 12:39:19

标签: c vector

我需要使用的函数需要带有以下签名的返回存储的vec​​tor参数:

char ***vvar

我应该在那里传递什么? 之后如何访问元素?

3 个答案:

答案 0 :(得分:1)

假设你想要一个创建字符串向量的函数。您可以定义它并像这样调用它:

#include "stdio.h"
#include "stdlib.h"

void make_vector(char*** vvar)
{
   /* We're going to create a vector of strings. */
   char** vector = malloc(sizeof(char*) * 3 );
   vector[0] = "Hello";
   vector[1] = "world!";
   vector[2] = NULL;

   /* Now we give the address of our vector to the caller. */
   *vvar = vector;
}

int main(void)
{
   char** vector_of_strings = NULL;
   make_vector(&vector_of_strings);
   printf("%s\n", vector_of_strings[0]);
   return 0;  /* Memory leak is an exercise for the reader. :-) */
}

(在这个示例中,让make_vector返回数组会更简单,但在更复杂的示例中,传递vector_of_strings的地址是合理的。)

答案 1 :(得分:0)

我将假设向量将包含字符串,因为这对您描述的签名最有意义。 由于您还没有提供任何代码,我将假设您需要调用的函数类似于:

/* This function creates a vector with room for 'length' strings and places it in 'vvar' */
void create_string_vector(int /* in */ length, char*** /* out */ vvar);

由于函数希望能够更改vvar并在调用者中反映出该更改,因此必须传递某个变量的地址,因此调用应该看起来像

create_string_vector(my_length, &my_var);

它处理一个指针级别 这只留下了如何声明my_var的问题。因为它将是未知大小的向量或数组,所以您需要将其声明为指针。字符串也是一种未知大小的字符数组,所以你也需要一个指针。这导致声明

char* *my_var;

元素访问很容易:您可以将my_var视为数组:

my_var[0] = "Hello";

答案 2 :(得分:-1)

这不是它的外观矢量。

如果函数签名是像函数(...,char *** vvar,...)这样的东西,那么你的解决方案并不简单。

您需要知道每个维度需要多少缓冲区空间,然后按如下方式创建复杂数组:

int dim_1 = 5, dim_2 = 4, dim_3 = 10;
char ***buffer = malloc(sizeof(char**)*dim_1);
for (int i=0;i++;i<dim_1) {
  char **buffer_2 = malloc(sizeof(char*)*dim_2);
  for (int j=0;j++;j<dim_2) {
    char *buffer_3 = malloc(dim_3);
    buffer_2[j] = buffer_3;
  }
  buffer[i] = buffer_2;
}