結構體定義:
struct VNode {
int data;
ArcNode *firstarc;
};
struct VNode G[MAX_SIZE];
代碼中 scanf("%d", &G[i]); 直接對結構體數組元素取地址賦值,但結構體包含兩個成員,為何能正確賦值給 data?
結構體變量的地址 = 其第一個成員的地址。
&G[i] 的類型是 struct VNode*,值為結構體起始地址&G[i].data 的類型是 int*,值同樣為結構體起始地址G[i] 內存佈局:
+----------------+------------------+
| data (int) | firstarc (ptr) | <- 連續內存
+----------------+------------------+
^
|___ &G[i] == &G[i].data (同一地址)
scanf("%d", &G[i]);
%d 期望 int* 參數struct VNode*,編譯器發出類型不匹配警告(但允許編譯)scanf 將讀取的整數寫入該地址起始的 sizeof(int) 字節data 成員區域 → 達到「給 data 賦值」的效果// 明確指定成員,類型安全,可讀性強
scanf("%d", &G[i].data);
// 或使用指針中間變量
struct VNode *p = &G[i];
scanf("%d", &p->data);
format '%d' expects argument of type 'int*', but argument has type 'struct VNode*'&G[i] 能給 data 賦值,利用的是結構體首地址等於首成員地址的內存佈局特性,屬於非標準、不安全的「巧合」用法。生產代碼必須使用 &G[i].data 明確指定成員。