2010-09-24 5 views
1

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

char ***vvar 

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

+0

Для уточнения: Вы имеет функцию: f1 (вектор ж) {. ..; return char *** vvar}? или вернуть вектор <***char>? – IProblemFactory

+1

@Rin: это C не C++ –

+0

Этот вопрос нуждается в уточнении. Имеется ли в документации какая-либо документация? Если нет, можете ли вы попытаться выяснить, что вы думаете: что содержит вектор? Строки? Предполагается ли, что память для этого вектора будет выделена функцией или вами? – dave

ответ

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)

+0

Действительно ли нужно использовать значение возврата malloc? – Nyan

+0

@Nyan: Нет, не в C, вы совершенно правы. Теперь исправлено. (Я провожу слишком много времени, смешивая C и C++ :-) – RichieHindle

-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; 
} 
+0

Это код на C++, а не C –

+1

@Alexander Rafferty: А что ** C ** заголовок вы включаете для оператора 'new'? – Praetorian

+0

Я очень привык к использованию нового оператора, и если кто-то захочет просто изменить его на malloc, это нормально. Я не понимаю, почему люди все еще используют C (просто мое мнение). –

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"; 
Смежные вопросы