2013-08-02 72 views
2

你好,請告訴我以下的輸出:字符指針和printf

main() 
{ 
    char ***x = "jjhljlhjlhjl"; 
    char **q = *x; 

    printf("x:%s\n",x); 
    printf("q:%s\n",&q);  

} 

Output: 
x:jjhljlhjlhjl 
q:jjhl 

爲什麼是Q不打印整個x的?

+1

它是'int main()',順便說一句。 – alk

+1

實際上,K&R C允許沒有類型的函數聲明(暗示'int') –

回答

5

你的程序調用未定義的行爲,所以對它的輸出沒有任何限制。

char ***x = "jjhljlhjlhjl"; 

雖然x是一個指向指針的指針,它被分配一個字符串的地址。

char **q = *x; 

q是一個指針的指針,並且被分配解除引用x的結果。由於x實際上是指向不兼容類型的對象,所以它的推理結果是未定義的。

如果我們假裝這是應該的工作,然後*x現在是一個指針的指針,因此就好像它是一個地址,它可能對待sizeof(char **)字節字符串字面量和值賦給q

printf("x:%s\n",x); 

由於x是一個指針,該指針值被傳遞給printf()。由於提供了%s,指針值被視爲一個字符串。由於x被分配了字符串文字的地址,該字符串就是打印的內容。

printf("q:%s\n",&q);  

q地址傳遞給printf()。由於提供了%s,指針值被視爲一個字符串。但是,推斷該指針的內容實際上是字符串文字的sizeof(char **)字節。不能保證讀取的字節將被正確地NUL終止,所以它只是偶爾打印某些東西。

1

問題是字符串"jjhljlhjlhjl"只是一個char *,而您將它分配給一個char ***。當您打印x時,它會被char *解釋爲printf,這是一個正確的字符串。

至於印刷&q作爲字符串地址,您正在有效地打印q的內容。當你解除引用x時,你會得到一個char **,在你的情況下,它是4個字節。但是由於x實際上指向文本數據,所以*x將獲取字符串的前四個字節(即字符)。它的印刷只有四個字符是純粹的機會。