如果我編譯以下代碼并運行它gcc source.c && ./a.out:
#include <stdio.h>
int main(void) {
char string[] = "My string";
char m = string[0];
printf("%s\n", &m);
}
我得到MMy string作為輸出,但如果我這樣做
#include <stdio.h>
int main(void) {
char string[] = "My string";
char m = string[0];
printf("%s\n", &string[0]);
}
我得到My string正如預期的那樣。這里發生了什么?我注意到如果我將指標定義為變數,例如
#include <stdio.h>
int main(void) {
char string[] = "My string";
char *m = &string[0];
printf("%s\n", m);
}
然后我又得到My string了預期的結果。為什么在第一個示例中指標的值會列印兩次?
uj5u.com熱心網友回復:
第一個程式有未定義的行為。
運算式 &m 不指向字串的字符。它指向一個 char 型別的物件
char string[] = "My string";
char m = string[0];
在物件 m 之后,記憶體中可以有任何東西。它只是以這樣一種方式發生,在物件 m 之后有一個沒有任何間隙的陣列字串。
但是轉換說明符 %s 需要一個指向字串的指標,該字串指向以零字符“\0”結尾的字符序列。
在第二個程式中,指標 m 指向存盤在陣列 string 中的字串的第一個字符。
char string[] = "My string";
char *m = &string[0];
所以第二個程式是正確的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394534.html
