2014-07-06 85 views
3

我已經寫以下示例代碼來演示我的問題傳遞一個字符指針數組

#include <iostream> 
#include <string.h> 

using namespace std; 

void f (char*** a) 
{ 
    *a = new (char*[2]); 
    *a[0] = new char[10]; 
    *a[1] = new char[10]; 
    strcpy(*a[0], "abcd"); 
    strcpy(*a[1],"efgh"); 
} 

int main() 
{ 
    char** b = NULL; 
    f(&b); 
    cout<<b[0]<<"\n"; 
    cout<<b[1]<<"\n"; 
    return 1; 
} 

在該代碼中,我發現,一個新=(CHAR [2])的函數;不分配* a [1]的內存。

在gdb中我得到以下賽格故障。

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400926 in f (a=0x7fffffffdfe8) at array1.cpp:10 
10   *a[1] = new char[10]; 
(gdb) p *a[1] 
Cannot access memory at address 0x0 

這實在讓我很困惑。有人可以解釋我出錯的地方嗎?

我知道我可以通過狀空洞˚F參數(字符** &一),並通過調用函數f(b)和工作原理。但是,如果我使用char *** a,我想知道發生了什麼。它也應該工作。對不起,如果這是一個愚蠢的問題。
任何教程或參考上述問題將不勝感激。
在此先感謝。

+0

我當然希望這僅僅是一個或多或少的學術問題和您正在使用'標準::矢量'等人在生產代碼... :) –

回答

8

這是因爲operator precedence,其中數組索引操作[]具有比引用操作*優先級較高。

所以表達式*a[0]確實是從編譯器的角度來看,與*(a[0])一樣,這不是你想要的。

你必須明確地加括號可以更改優先級:

(*a)[0] = ... 
+0

的#include 的#include 使用命名空間std ; 空隙F(炭***一個) { * A =新的(字符* [2]); (* a)[0] = new char [10]; (* a)[1] = new char [10]; strcpy((* a)[0],「Saurab」); strcpy((* a)[1],「srivastav」); } INT主() { 字符** B = NULL; F(&b); COUT << B [0] << 「\ n」 個; COUT << B [1] << 「\ n」 個; 返回1; } 現在其工作 – SaurabhS

+2

實際上'*一[0]'因爲它是正確的!'* a [0]'和'(* a)[0]'都是'a [0] [0]' - 把零置換都沒有區別。 。* a [1] == a [1] [0]'但是(* a)[1] == a [0] [1]'。 –

0

一個[0],A [1]是字符,並且他們在他們的值,解引用該值將明顯導致分割故障。你可能想要做的是:

(*a)[...] 

dereference'a'這是一個指針,這將給你一個數組。