回答
比方說,你想創建一個字符串矢量功能。你可以定義它,並調用它像這樣:
#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 2010-09-24 13:08:03
@Nyan:不,不是C,你說得很對。現在修復。 (我花了太多時間混合C和C++ :-) – RichieHindle 2010-09-24 13:22:09
這不是它的外觀向量。
如果函數簽名有點像函數(...,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 – 2010-09-24 13:01:38
@Alexander Rafferty:您爲'new'運算符添加了哪些** C **頭? – Praetorian 2010-09-24 13:02:27
我非常習慣於使用新的操作符,如果有人想只是將它改爲malloc就沒有問題。我不明白爲什麼人們仍然在使用C(只是我的意見)。 – 2010-09-24 13:41:35
我會假定矢量將包含字符串,因爲這對您描述的簽名最有意義。 當你還沒有給任何代碼,我會假設你需要調用該函數類似於此:
/* 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";
- 1. 從矢量<string>轉換爲矢量<char*>至char **
- 2. 從矢量載體獲取載體
- 3. C++:轉換矢量<char>
- 4. 打印載體的矢量
- 5. [R矢量 - 減去載體
- 6. 複製載體矢量
- 7. 將矢量<unsigned char>轉換爲矢量<unsigned short>
- 8. 如何將矢量<string>轉換爲矢量<char*>
- 9. 如何轉換矢量<矢量<string>>爲char **
- 10. 如何將Char []轉換爲矢量
- 11. 拷貝載體的價值觀爲char *
- 12. C++爲矢量分配矢量
- 13. 矢量矢量C++
- 14. 將矢量<string>轉換爲char ** C++
- 15. C++投矢量<無符號字符>爲unsigned char *
- 16. 爲什麼ptrVec =新載體<const char*>編譯失敗
- 17. 矢量的矢量,C++
- 18. C++矢量矢量故障
- 19. 訪問在載體的載體的C++矢量但沒有照搬
- 20. 找到一個載體內的矢量
- 21. 地圖載體將矢量地圖
- 22. C++矢量大小爲零
- 23. C++載體 - acessing型結構的矢量大小的結構
- 24. C++轉換包含對象,以含有載體矢量加倍
- 25. 循環幫助:字符串矢量到3D char矢量
- 26. 矢量在C++窗體中的使用
- 27. C++專門爲載體
- 28. 傳遞載體<char>的指針的char *
- 29. 在矢量類(Java)中加載矢量
- 30. C++矢量向量
澄清:你有一個函數:F1(矢量>瓦特){。 ..;返回char *** vvar}?或返回向量<***char>? – IProblemFactory 2010-09-24 12:43:51
@Rin:這是C而不是C++ – 2010-09-24 12:44:33
這個問題需要澄清。函數是否有任何文檔?如果不是,你能否試圖澄清你的想法:矢量包含什麼?字符串?這個矢量的內存應該由函數還是你自己分配? – dave 2010-09-24 12:53:21