2013-11-02 77 views
1

我們可以指定一個字符串常量char *char [ ]只是想:爲什麼不能用char **定義字符串數組?

char *p = "hello"; 
char a[] = "hello"; 

現在對於字符串數組,當然它會是這樣的:

char **p = {"hello", "world"}; // Error 
char *a[] = {"hello", "world"}; 

第一種方式將產生警告編譯時,並有Segmentation fault當我試圖打印字符串常量與printf("%s\n", p[0]);

W hy?

+1

「生成警告」,並且該警告是...? – chux

+0

@chux,「從不兼容的指針類型初始化」 – Bin

回答

2
char **p = {"hello", "world"}; 

這裏,p是指針char不能與數組初始化的指針(每一個字符串文字的初始化期間被轉換成指針的數組初始化的指針 - 實際類型在C中的字符串文字是char[n])。

類型是不相容的,即p的類型爲char **,RHS的類型爲char *[]。因此,診斷由編譯器發佈。

然而,

char *a[] = {"hello", "world"};

是有效作爲a是一個指針數組和char類型匹配。因此這是一個有效的初始化。

char **p = (char *[]) {"hello", "world"}; 

因此,無論使用複合文字如果C99或更高被支承:


由於C99,複合文字(6.5.2.5,C99)使用它可以初始化C語言支持你的編譯器。否則,堅持指針初始化數組(char *a[])。

您可以在compound literals here (gcc manual).

1

因爲char **p是指針的指針不是指針的數組,其中char* a[]是一個指針數組

char *ptr ="hello"; 

限定ptr是一個指針(只讀)串"hello",因此包含字符串的地址說100ptr本身必須存儲在某個地方:說位置200.

char **p = &ptr; 

現在pptr,也就是說,它包含的ptr(即200)的地址。

printf("%s",**p); 

所以你創建一個pointer to another pointer而不是額外的內存來存儲一個以上的字符串,但char *a[]創建指針數組取決於你給

的建議

不要使用尺寸char *p = "hello"; 使用const char *p = "hello"; 因爲字符串文字保存在只讀存儲器中

1

總而言之,因爲char ** p指向一個指針,而不是一個指針數組。

發生這種情況是因爲您需要自行構建陣列。對於每個級別(或維度),您需要爲指針持有者保留內存。

你需要做的是:

// this holds you pointers 
char **p = malloc(sizeof(char *) * nr of elements); 

// to set the elements, you need to: 
p[0] = "hello"; 
p[1] = "world"; 

,這一點需要儘可能多的水平(或尺寸),你必須完成。

0

首先了解各種例子,char *p = "hello"char a[] = "hello"不同。

char *p = "hello" 

"hello"實際上是一個指向文字常量的指針。您將一個指針指向文字常量至p。所以最好使用const char *p = "hello"

char a[] = "hello" 

"hello"字符被複制到陣列a'\0'端。

其次,

char *a[] 

定義一個指針數組,所以沒關係使用char *a[] = {"hello", "world"};

char **p 

定義一個指針指向一個字符,所以它是沒有意義的使用char **p = {"hello", "world"};

相關問題