C вектор как символ *** вектор - PullRequest
       7

C вектор как символ *** вектор

1 голос
/ 24 сентября 2010

Функция, которую мне нужно использовать, требует векторного аргумента для хранения возврата со следующей подписью:

char ***vvar

Что я должен там пройти? Как я могу получить доступ к элементам позже?

Ответы [ 3 ]

1 голос
/ 24 сентября 2010

Допустим, вам нужна функция, которая создает вектор строк.Вы можете определить это и назвать его так:

#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.)

0 голосов
/ 24 сентября 2010

Я предполагаю, что вектор будет содержать строки, так как это имеет смысл с подписью, которую вы описываете. Поскольку вы также не дали никакого кода, я предполагаю, что функция, которую нужно вызвать, выглядит примерно так:

/* 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";
0 голосов
/ 24 сентября 2010

Похоже, это не вектор.

Если сигнатура функции похожа на функцию (..., 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...