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

C語言結構體指針常見錯誤:字符數組與字符指針的區別

     編輯:C 語言問答

問題現象

在結構體中定義 char name; 並嘗試用 strcpy 複製字符串時,編譯器報錯或運行崩潰。

錯誤原因分析

  • char name; 僅分配 **1 個字節**,只能存放單一字符(如 'A')。
  • strcpy 要求目標地址指向足夠大的 **字符數組**,用於存放以 \0 結尾的字符串。
  • 將字符串複製到單字節空間會導致緩衝區溢出,破壞鄰近內存,引發未定義行為。

正確解決方案

// 定義結構體時使用字符數組
struct Student {
    char name[20];  // 預留 20 字節,可存 19 字符 + '\0'
    int age;
};

// 使用 strcpy 安全複製
struct Student s;
strcpy(s.name, "Zhang San");  // 正確

進階補充:動態分配字符串

若字符串長度不固定,可結合 malloc 使用字符指針:

struct Student {
    char *name;  // 指針
    int age;
};

struct Student s;
s.name = (char *)malloc(strlen("Zhang San") + 1);
strcpy(s.name, "Zhang San");
// 使用完畢後必須 free(s.name)

核心原則總結

  1. **固定長度** → 結構體內直接定義數組 char name[N]。
  2. **可變長度** → 結構體內定義指針 char *name,運行時動態分配。
  3. **切勿** 用 char name; 存字符串,也切勿對未分配內存的指針使用 strcpy。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved