Функции мне нужно использовать требует векторного аргумента для возврата хранения со следующей подписью:C вектор в символьном *** вектор
char ***vvar
Что я должен пройти туда? Как мне получить доступ к элементам после этого?
Функции мне нужно использовать требует векторного аргумента для возврата хранения со следующей подписью:C вектор в символьном *** вектор
char ***vvar
Что я должен пройти туда? Как мне получить доступ к элементам после этого?
Допустим, вы хотите функцию, которая создает вектор строк. Вы можете определить его и назвать его так:
#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
)
Действительно ли нужно использовать значение возврата malloc? – Nyan
@Nyan: Нет, не в C, вы совершенно правы. Теперь исправлено. (Я провожу слишком много времени, смешивая C и C++ :-) – RichieHindle
Это не вектор по внешнему виду.
Если функция-функция является чем-то вроде функции (..., 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;
}
Это код на C++, а не C –
@Alexander Rafferty: А что ** C ** заголовок вы включаете для оператора 'new'? – Praetorian
Я очень привык к использованию нового оператора, и если кто-то захочет просто изменить его на malloc, это нормально. Я не понимаю, почему люди все еще используют C (просто мое мнение). –
Я буду предполагать, что вектор будет содержать строки, поскольку это имеет наибольший смысл с подписью, которую вы описываете. Как вы также не дали никакого кода, я буду считать функцию вам необходимо позвонить выглядит примерно так:
/* 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";
Для уточнения: Вы имеет функцию: f1 (вектор > ж) {. ..; return char *** vvar}? или вернуть вектор <***char>? – IProblemFactory
@Rin: это C не C++ –
Этот вопрос нуждается в уточнении. Имеется ли в документации какая-либо документация? Если нет, можете ли вы попытаться выяснить, что вы думаете: что содержит вектор? Строки? Предполагается ли, что память для этого вектора будет выделена функцией или вами? – dave