這純粹是基于理論的,但我有這個代碼:
int i = 3, k[] = {2, 4, 6, 8, 10, 12}, *x = &i, *y = k;
double d = 1.5;
struct point_tag {
int x, y;
char *name;
} pt[] = {{200, 40, "begin"}, {300, 100, "end"}}, *pp = pt;
以及這兩個運算式:
pt[i--].y 50 這會在運行時導致未定義的行為
*(*pp.name 2) 哪個不編譯
我只想知道為什么頂部的不能運行,為什么底部的不能編譯,即使*((*pp).name 2)可以。
uj5u.com熱心網友回復:
pt[i--].y 50這會在運行時導致未定義的行為
該陣列pt的大小為 2,因為您添加了兩個初始化項。這導致有效的索引值為 0 和 1。i初始值為 3。您只需越界訪問陣列。
*(*pp.name 2)哪個不編譯
運算子優先于.之前*。
uj5u.com熱心網友回復:
您將陣列宣告pt為具有 2 個元素。變數i由值初始化3
int i = 3,...;
所以這個帶有下標運算子的運算式
pt[i--].y 50
訪問陣列之外??的記憶體,因為陣列的有效索引范圍是[0, 2)。
至于這個表情
*(*pp.name 2)
那么它與運算式相同
*(*( pp.name ) 2 )
由于變數pp是一個指標,您可能無法應用點運算子。
你至少需要寫
*( ( *pp ).name 2)
uj5u.com熱心網友回復:
pt[i--].y 50這會在運行時導致未定義的行為
i存盤了該值,3并且您只有一個兩個插槽的陣列。由于你在定義陣列時沒有在括號中指定長度,所以初始化器表示陣列的大小,初始化器只有兩個單元格。您只能訪問索引0和1,其余的是未定義的行為。(3是遠離陣列的兩個插槽)。
*(*pp.name 2)哪個不編譯
這是正常的。欄位選擇比指標取消參考具有更高的優先級,因此它被解釋為*((*(pp.name)) 2),其中pp.name無效,pp指標也是無效的,而不是struct。順便說一下,(*pp)是一個struct,所以(*pp).name會編譯得很好。
我只想知道為什么頂部的不能運行,為什么底部的不能編譯,即使
*((*pp).name 2)可以。
這會編譯,因為*pp是 a struct,所以欄位訪問器作業的(*pp).name是一個指向 的指標char,所以(*pp).name 2(和等效的pp->name 2)也是一個指標(指向的第三個字符的pp->name指標,并且*((*pp).name 2)是指向的字符(在 的第三個位置)欄位名稱)
最后,我建議你,如果你想結束對指標的理解并且不討厭它們,你可以從更簡單的運算式開始,使用->and[]運算子(用于簡化指標運算式,這看起來很不自然,因為運算子優先級)并使事情復雜化,只要您先了解基本知識即可。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/378673.html
上一篇:分段錯誤(核心轉儲)C
