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

C 語言結構體賦值與指針誤區:b=a 是拷貝非指向

     編輯:程式設計綜合問答

代碼片段

typedef struct stu {
    char name[10], gender;
    int score;
} STU;

void f(char *p) {
    strcpy(p, "Qian");
}

int main() {
    STU a = {"zhao", 'm', 290}, b;
    b = a;          // 關鍵行
    f(b.name);
    b.gender = 'f';
    b.score = 350;
    printf("%s,%c,%d,", a.name, a.gender, a.score);
    printf("%s,%c,%d,", b.name, b.gender, b.score);
    return 0;
}

輸出:zhao,m,290,Qian,f,350,

疑問:b = a 以為是讓 b 指向 a 的地址,為何修改 b 成員不影響 a?

核心解釋

b = a 是結構體變量之間的「值拷貝」,而非指針賦值。

  • STU a, b; 定義了兩個**獨立的結構體變量**,各自佔據棧上一塊內存。
  • b = a 將 a 的所有成員逐字節複製到 b,兩者內容相同但**地址不同**,互不干擾。
  • 後續 f(b.name) 修改的是 b 內部的 name 數組,a 的 name 保持不變。

對比:真正的指針指向

STU a = {"zhao", 'm', 290};
STU *b = &a;   // b 是指針,指向 a 的地址
b->gender = 'f'; // 修改 a 的成員
// 或 (*b).gender = 'f';

這時 b 與 a 共享同一塊內存,修改 b 即修改 a。

記憶口訣

  • 結構體變量賦值 = 內容拷貝(如 b = a)。
  • 結構體指針賦值 = 地址引用(如 STU *b = &a)。
  • C 語言無「引用類型」,只有值與指針。

進階補充:包含指針成員時的淺拷貝陷阱

若結構體含指針成員(如 char *name),b = a 只拷貝指針值,兩結構體指向同一字符串,修改內容會相互影響,需手動深拷貝。本例中成員皆為值類型(數組、基本類型),故拷貝安全。

總結

b = a **不是**讓 b 指向 a,而是**把 a 的內容複製給 b**。理解「值語義」與「指針語義」的區別,是掌握 C/C++ 內存模型的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved