首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 指針加法與解引用:*q 輸出地址而非值,因 q 未初始化指向無效內存

     編輯:程式設計綜合問答

代碼與輸出


int a = 3, *p = &a;
int *q = p + 1;   // q 指向 a 後面的一個 int 位置(未初始化)
printf("p=%d q=%d *q=%d\n", p, q, *q);
// 輸出: p=2293308 q=2293312 *q=2293312

原因

  1. p + 1 指針運算:地址增加 sizeof(int)(4 字節),q 指向 a 緊鄰的下一個整數槽位(屬於未定義內存)。
  2. *q 讀取該未初始化內存,恰巧該內存殘留值等於 q 自身的地址(2293312),屬巧合,屬於未定義行為 (UB)。

正確理解

  • 指針加法 p + n 移動 n * sizeof(*p) 字節。
  • 解引用 *q 只有在 q 指向有效對象時才有意義。
  • 訪問數組越界、未初始化指針、釋放後內存均為 UB,結果不可預測。

避免 UB


int arr[2] = {3, 4};
int *p = &arr[0];
int *q = p + 1;   // 合法:指向 arr[1]
printf("*q = %d\n", *q); // 穩定輸出 4
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved