2015-05-18 92 views
3

我有一個char[][]轉換的char [] []到char **

char c[2][2]={ 
    {'a','b'}, 
    {'c','d'} 
    }; 

我怎樣才能將其轉換爲char**

這裏的目標是使用轉換的char**作爲主函數的輸入,該函數僅接受char**作爲其輸入。這兩種C/C++解決方案都可以接受。

+0

這是用於C還是C++?你想在'char **'**或**中只是'char [] []'的一個副本嗎?你想轉換爲一個char **指向**串**的數組嗎? (例如,你是否試圖最終能夠用'printf(「%s \ n」,array [i])打印字符串;'?)我們必須知道'main函數'用'char ** '或者我們只是在猜測...... –

回答

5

雖然可以很容易地切換從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字符串。在這種情況下,雖然您的代碼可以編譯,但結果可能不是您所期望的(緩衝區溢出)。

+1

再次讀到這個問題,他大概是想用null結尾的字符串。 –

+0

@KarolyHorvath是的!我剛剛重新安裝並添加了一個額外的評論。 – Christophe

+0

也,'argv'是NULL終止。不知道OP是否期待這個.. –

2

您不能轉換char[2][2]char**,你只能將其轉換爲char(*)[2]

char (*p)[2] = c; 

上面是一個指向數組的-2字符。請注意,你需要這個2,並且不能只寫char** p,因爲在後一種情況下,你不能執行指針算術(指針不知道有多少元素在增量時「跳躍」,你將無法尋址數組的元素(在這種情況下是行))。

2

您可以在陣列傳遞到像這樣的功能:

char c[2][2] = { 
    {'a','b'}, 
    {'c','d'} 
}; 

char* x[] { c[0], c[1] }; 
func(x); // Assuming something like: void func(char** p); 
1

注:雖然這個答案可以解釋/說明這個問題非常好其他的答案是最好建議創建一個自動變量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 
} 
+0

'char * param [2];'會遠遠優於'char ** param = new char * [2];' –

+0

@MattMcNabb是的,我同意。我會解決這個問題。 – Galik

+0

@MattMcNabb好吧,我現在不能刪除它,指向其他答案 – Galik