我有一個char[][]
轉換的char [] []到char **
char c[2][2]={
{'a','b'},
{'c','d'}
};
我怎樣才能將其轉換爲char**
?
這裏的目標是使用轉換的char**
作爲主函數的輸入,該函數僅接受char**
作爲其輸入。這兩種C/C++解決方案都可以接受。
我有一個char[][]
轉換的char [] []到char **
char c[2][2]={
{'a','b'},
{'c','d'}
};
我怎樣才能將其轉換爲char**
?
這裏的目標是使用轉換的char**
作爲主函數的輸入,該函數僅接受char**
作爲其輸入。這兩種C/C++解決方案都可以接受。
雖然可以很容易地切換從char[]
到char*
,同樣是不可能的char[][]
和char**
:
char[2][2]
是具有連續存儲的所有元素有2維陣列。爲了訪問一個元素,編譯器計算知道每行大小的偏移量。char**
指向包含指向char的指針的數組。爲了訪問一個元素,你的編譯器計算最左邊的指針的偏移量,加載該poitner,然後訪問該元素。解決方法:
char *pc[2]={c[0],c[1]};
cout << pc[1][1]<<endl; // prints out the same as c[1][1]
// you can pass `pc` when a `char**` is needed
注:這個編譯完美。然而,一些像char **av
這樣的參數的函數實際上期望av[i]
爲空終止的c字符串。在這種情況下,雖然您的代碼可以編譯,但結果可能不是您所期望的(緩衝區溢出)。
再次讀到這個問題,他大概是想用null結尾的字符串。 –
@KarolyHorvath是的!我剛剛重新安裝並添加了一個額外的評論。 – Christophe
也,'argv'是NULL終止。不知道OP是否期待這個.. –
您不能轉換char[2][2]
到char**
,你只能將其轉換爲char(*)[2]
,
char (*p)[2] = c;
上面是一個指向數組的-2字符。請注意,你需要這個2
,並且不能只寫char** p
,因爲在後一種情況下,你不能執行指針算術(指針不知道有多少元素在增量時「跳躍」,你將無法尋址數組的元素(在這種情況下是行))。
您可以在陣列傳遞到像這樣的功能:
char c[2][2] = {
{'a','b'},
{'c','d'}
};
char* x[] { c[0], c[1] };
func(x); // Assuming something like: void func(char** p);
注:雖然這個答案可以解釋/說明這個問題非常好其他的答案是最好建議創建一個自動變量char*[2];
而不是像new
那樣分配這個答案。
原來的答覆:
問題是char c[2][2]
是char
的連續塊。編譯器只分配4個char
對象。
當構建一個陣列陣列(char** c
)需要手動分配的指針的數組到char
然後分配(或分配)的和的char
陣列到每個這些指針的。
所以要轉換您的陣列char c[2][2]
到陣列你必須首先創建指針數組,然後分配給每個陣列焦炭的到的第一個元素的數組陣列。
事情是這樣的:
void func(char** c)
{
for(int x = 0; x < 2; ++x)
for(int y = 0; y < 2; ++y)
std::cout << c[x][y] << ' ';
std::cout << '\n';
}
int main(int, char* argv[])
{
// one contiguous block of 4 chars
char c[2][2]={
{'a','b'},
{'c','d'}
};
char** param = new char*[2]; // create your own pointer array
param[0] = &c[0][0]; // assign the first element of each char array
param[1] = &c[1][0];
func(param); // call your func
delete[] param; // cleanup
}
如果你有C++11
,你可以使用智能指針,以防止內存泄漏,如果有異常拋出或有人忘記delete
。
int main(int, char* argv[])
{
// one contiguous block of 4 chars
char c[2][2]={
{'a','b'},
{'c','d'}
};
// use a smart pointer
std::unique_ptr<char*[]> param(new char*[2]);
param[0] = &c[0][0];
param[1] = &c[1][0];
func(param.get()); // now if this throws, no memory leak
// delete[] param; // NO NEED TO DELETE
}
這是用於C還是C++?你想在'char **'**或**中只是'char [] []'的一個副本嗎?你想轉換爲一個char **指向**串**的數組嗎? (例如,你是否試圖最終能夠用'printf(「%s \ n」,array [i])打印字符串;'?)我們必須知道'main函數'用'char ** '或者我們只是在猜測...... –