char const c = 'x'; /* 1 */
char *p1; /* 2 */
char const **p2 = &p1; /* 3 */
*p2 = &c; /* 4 */
*p1 = 'X'; /* 5 */
第 3行在C 中是不允許的,在 C 中無效。然而,一個人在 C 中得到一個錯誤,但在 C 中只有一個警告。問題是 - 為什么只有一個警告?
uj5u.com熱心網友回復:
無論C&C 處理陳述句3作為“分配const char**與char**丟棄const所不同的是限定詞”; C 比 C 更嚴格,不允許const丟棄限定符。這在 C 中非常方便,并且不會導致與 C 相反的問題。
想象一下以下代碼:
char const c = 'x';
char *p1 = &c;
*p1 = 'A';
printf("c address: 0x%X, p1 is pointing to: 0x%X\n", &c, p1);
printf("%c\n", c);
printf("%c\n", *p1);
這是一個可編譯的 C 代碼。有人會認為分配一個新值*p1應該是不可能的,因為它指向一個const變數。還有人會認為,如果它確實發生了,我們可以改變 p 所指向的值,這也會改變 的值,c
但事實并非如此!!
上面的代碼出人意料地生成:
c address: 0xEF3E146B, p1 is pointing to: 0xEF3E146B
x
A
因此,允許丟棄這個 const 限定符確實會導致未定義的行為(這意味著由編譯器決定要做什么)。這在 C 中是固定的,以避免這種歧義。
uj5u.com熱心網友回復:
C 的指標規則比 C 寬松得多。C 比 C 強制執行更多的型別安全。其中一些取決于編譯器決定只在 C 中發出警告。
要查看的一個示例是 malloc,其中的char* str = malloc(50);C 非常好,但必須使用char* str = (char*) malloc(50);C 。
uj5u.com熱心網友回復:
簡短的回答是:因為它們是不同的語言并且有不同的規則。沒有 C/C 語言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335272.html
上一篇:單鏈表中的選擇排序不使用交換
