你好,請告訴我以下的輸出:字符指針和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的?
你好,請告訴我以下的輸出:字符指針和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的?
你的程序調用未定義的行爲,所以對它的輸出沒有任何限制。
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
終止,所以它只是偶爾打印某些東西。
問題是字符串"jjhljlhjlhjl"
只是一個char *
,而您將它分配給一個char ***
。當您打印x
時,它會被char *
解釋爲printf
,這是一個正確的字符串。
至於印刷&q
作爲字符串地址,您正在有效地打印q
的內容。當你解除引用x
時,你會得到一個char **
,在你的情況下,它是4個字節。但是由於x
實際上指向文本數據,所以*x
將獲取字符串的前四個字節(即字符)。它的印刷只有四個字符是純粹的機會。
它是'int main()',順便說一句。 – alk
實際上,K&R C允許沒有類型的函數聲明(暗示'int') –