2010-09-24 68 views
1

我需要使用功能要求退貨存儲,有以下特徵向量的說法:C載體爲char ***矢量

char ***vvar 

那我應該通過在那裏? 之後如何訪問元素?

+0

澄清:你有一個函數:F1(矢量瓦特){。 ..;返回char *** vvar}?或返回向量<***char>? – IProblemFactory 2010-09-24 12:43:51

+1

@Rin:這是C而不是C++ – 2010-09-24 12:44:33

+0

這個問題需要澄清。函數是否有任何文檔?如果不是,你能否試圖澄清你的想法:矢量包含什麼?字符串?這個矢量的內存應該由函數還是你自己分配? – dave 2010-09-24 12:53:21

回答

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 2010-09-24 13:08:03

+0

@Nyan:不,不是C,你說得很對。現在修復。 (我花了太多時間混合C和C++ :-) – RichieHindle 2010-09-24 13:22:09

-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 – 2010-09-24 13:01:38

+1

@Alexander Rafferty:您爲'new'運算符添加了哪些** C **頭? – Praetorian 2010-09-24 13:02:27

+0

我非常習慣於使用新的操作符,如果有人想只是將它改爲malloc就沒有問題。我不明白爲什麼人們仍然在使用C(只是我的意見)。 – 2010-09-24 13:41:35

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";