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

C 語言結構體變數宣告錯誤修正:標籤 vs 變數名、struct aa vs struct { ... } aa

     編輯:C 語言問答

錯誤代碼

#include "stdio.h"
struct aa {
    int a, b, c;
};
void main() {
    aa.a = 2;   // 錯誤:aa 是結構體標籤,非變數名
    aa.b = 3;
    aa.c = 4;
    printf("%d %d %d", aa.a, aa.b, aa.c);
}

錯誤原因

struct aa { ... }; 只是定義了一個**結構體標籤**(型別名稱),**未建立任何變數**。aa.a 試圖用標籤當變數存取成員,編譯器報錯「aa undeclared」或「request for member in something not a structure」。

兩種正確宣告方式

方式 1:分開宣告標籤與變數(推薦,清晰)

#include 

struct AA {          // 標籤習慣大寫
    int a, b, c;
};

int main(void) {
    struct AA aa;    // 變數名可用小寫 aa
    aa.a = 2;
    aa.b = 3;
    aa.c = 4;
    printf("%d %d %d\n", aa.a, aa.b, aa.c);
    return 0;
}

方式 2:定義同時宣告變數(匿名標籤)

#include 

struct {            // 無標籤
    int a, b, c;
} aa;               // 直接建立變數 aa

int main(void) {
    aa.a = 2; aa.b = 3; aa.c = 4;
    printf("%d %d %d\n", aa.a, aa.b, aa.c);
    return 0;
}

方式 3:typedef 別名(現代慣用)

typedef struct {
    int a, b, c;
} AA_t;             // 以 _t 結尾表示型別

int main(void) {
    AA_t aa = {2, 3, 4}; // C99 指定初始化器
    printf("%d %d %d\n", aa.a, aa.b, aa.c);
    return 0;
}

關鍵觀念釐清

寫法含義可建立多少變數
struct Tag { ... };定義標籤 Tag後續可用 struct Tag var; 建立任意多個
struct Tag { ... } var;定義標籤 Tag 並建立變數 var1 個(同一行)
struct { ... } var;匿名結構體,建立變數 var1 個(無標籤無法複用)
typedef struct { ... } Type;定義新型別 Type任意多個 Type var;

補充:void main() → int main(void)

標準要求 main 返回 int,請養成 int main(void) { ... return 0; } 習慣。

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