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

C 語言結構體數組初始化錯誤:只能聲明時整體賦值

     編輯:程式設計綜合問答

錯誤代碼

struct Std {
    char name[4];
};

struct Std student;
student.name = {'a', 'c', 'f', 'g'}; // ❌ 編譯錯誤

錯誤原因

C 語言規定:**數組類型成員只能在聲明(定義)時進行整體初始化**,後續賦值只能逐元素賦值,或使用庫函數(如 strcpy、memcpy)。

正確的三種寫法

1. 聲明時初始化(推薦)

struct Std student = {"acfg"};        // 字符串字面量自動補 \0
// 或
struct Std student = {{'a','c','f','g'}}; // 顯式列表,注意雙層大括號

2. 逐字符賦值

student.name[0] = 'a';
student.name[1] = 'c';
student.name[2] = 'f';
student.name[3] = 'g'; // 若作字符串用,需手動加 \0

3. 使用 strcpy(視為字符串時)

#include <string.h>
strcpy(student.name, "acf"); // 自動補 \0,確保目標空間足夠

進階:結構體數組批量初始化

struct Std class[3] = {
    {"Tom"},
    {"Jerry"},
    {"Bob"}
};

常見坑點提醒

  • char name[4] 只能存 3 個可見字符 + \0,若存 4 字符將無結束符,導致 printf("%s") 越界讀取。
  • 結構體賦值 s1 = s2 是**整體逐字節拷貝**,包含數組成員,這在聲明後賦值是合法的:
struct Std s1 = {"abc"};
struct Std s2;
s2 = s1; // ✅ 合法,數組內容一同拷貝

記住:**聲明時一次性初始化最簡潔安全;事後修改請用逐元素或庫函數。**

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