我執行了下面的代碼。爲什麼以這種方式分解單詞會崩潰?
#include <stdio.h>
int main()
{char *a="awake";
printf("%s\n", *(a+1));
return 0; // expected out_put to be wake
}
我執行了下面的代碼。爲什麼以這種方式分解單詞會崩潰?
#include <stdio.h>
int main()
{char *a="awake";
printf("%s\n", *(a+1));
return 0; // expected out_put to be wake
}
*(a+1)
相同a[1]
這是一個char
,而不是char *
是printf
預計爲%s
。
EDIT:澄清:printf
需要一個地址%s
說明符,a+1
是這樣一個地址(字符串中的第二個字符的即地址),但*(a+1)
然後給出在該地址的值。這只是一個字符,並且在所有可能的情況下都不是printf
的有效內存位置。
你解引用指針,這使得它成爲char
而是試圖輸出字符串。您的打印語句更改爲printf("%s\n", a+1);
可能是完全錯誤的,但據我所知在這種情況下+ 1給出的字符串的地址,但不是存儲在字符串中的值。所以我用*(a + 1)來獲得從w開始的字符,即喚醒(儘管不起作用)。我不明白它是如何印刷的,儘管我們只給出了地址。 –
你不想defrefeence的char *
:
printf("%s\n", (a+1));
你想要做什麼。
可能是我完全錯了,但據我所知在這種情況下+ 1給出了字符串的地址,但沒有存儲在字符串中的值。所以我用*(a + 1)來獲得從w開始的字符,即喚醒(儘管不起作用)。我不明白它是如何印刷的,儘管我們只給出了地址。 –
可能是完全錯誤的,但據我所知,在這種情況下+ 1給出字符串的地址,但不是存儲在字符串中的值。所以我用*(a + 1)來獲得從w開始的字符,即喚醒(儘管不起作用)。我不明白它是如何印刷的,儘管我們只給出了地址。 –
'a + 1' *是字符串中第二個字符的地址,但是'*(a + 1)'給出了該地址的值。 'printf'需要地址,而不是值。 – Kninnug
感謝您的幫助 –