複選題
9.下列C語言片段如下 int i[]={10,20,30,40,50}; int *ptr= i+2; 請問下列何者有誤?
(A) i[5]=50
(B) ptr[0]=30
(C) *(ptr + 1) =40
(D) *(i + 1) = 20
答案:登入後查看
統計: A(244), B(144), C(91), D(81), E(0) #1211734
統計: A(244), B(144), C(91), D(81), E(0) #1211734
詳解 (共 4 筆)
#5638550
不知道是不是太少人做到這題 這題怎麼看我都不太懂為何是複選...
看起來只有A有問題
1
0
#6417564
我們定義了一個整數陣列 i,其內容為 {10, 20, 30, 40, 50}。這個陣列有 5 個元素,索引分別是 0, 1, 2, 3, 4。
接著,我們定義了一個整數指標 ptr,並將其指向 i + 2。在 C 語言中,陣列名稱 i 在這裡會被隱式地轉換為指向其第一個元素的指標。i + 2 的意思是將指向陣列第一個元素的指標向後移動兩個整數的位置。因此,ptr 現在指向陣列 i 的第三個元素,也就是值為 30 的元素。
現在我們逐一分析每個選項:
(A) i[5]=50
- 陣列 i 的有效索引範圍是從 0 到 4。
- i[5] 試圖存取陣列中第六個元素,這超出了陣列的邊界。
- 在 C 語言中,存取超出陣列邊界的記憶體是未定義行為 (Undefined Behavior),可能會導致程式崩潰、資料損壞或其他不可預測的結果。
- 因此,i[5]=50 這個寫入操作是錯誤的。
(B) ptr[0]=30
- ptr 目前指向 i[2],其值為 30。
- 在 C 語言中,指標可以像陣列一樣使用索引。ptr[0] 等同於 *(ptr + 0),也就是指標 ptr 所指向的記憶體位置的值。
- 由於 ptr 指向 i[2],所以 ptr[0] 的值是 i[2] 的值,即 30。
- 因此,ptr[0]=30 這個敘述是正確的(讀取操作)。
*(C) (ptr + 1) =40
- ptr 指向 i[2]。
- ptr + 1 會將指標向後移動一個整數的位置,使其指向 i[3],其值為 40。
- *(ptr + 1) 表示取 ptr + 1 所指向的記憶體位置的值,也就是 i[3] 的值,即 40。
- 因此,*(ptr + 1) =40 這個敘述是正確的(讀取操作)。
*(D) (i + 1) = 20
- i 在這裡被視為指向陣列第一個元素的指標 (&i[0])。
- i + 1 會將指標向後移動一個整數的位置,使其指向 i[1],其值為 20。
- *(i + 1) 表示取 i + 1 所指向的記憶體位置的值,也就是 i[1] 的值,即 20。
- 因此,*(i + 1) = 20 這個敘述是正確的(讀取操作)。
結論:
根據以上的分析,選項 (A) i[5]=50 試圖存取超出陣列邊界的元素,是錯誤的。
因此,答案是 (A)。
0
0