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

C 語言 typedef 結構體初始化:靜態初始化與動態賦值

     編輯:程式設計綜合問答

結構體定義

typedef struct {
    uint32_t bits;
    uint8_t modulus[MAX_RSA_MODULUS_LEN];
    uint8_t exponent[4];
} R_RSA_PUBLIC_KEY;

靜態初始化 (編譯期常量)


const R_RSA_PUBLIC_KEY mtPosPPublicKey = {
    1024,
    "\xcf\xcc\xf7\xb4\xda\x91\x4d...", // 必須為字串常量,長度匹配 modulus 陣列
    {0x00, 0x01, 0x00, 0x01}
};

動態初始化 (執行期從變數賦值)

若 `gbszPublicKey` 為執行期填充的 `uint8_t gbszPublicKey[256+1]`,**無法在定義時直接用變數初始化結構體陣列成員**,必須先定義結構體變數,再用 `memcpy`/`strcpy` 複製:


R_RSA_PUBLIC_KEY key;
key.bits = 1024;
// 假設 gbszPublicKey 已填滿 256 字節 (不含結束符)
memcpy(key.modulus, gbszPublicKey, sizeof(key.modulus)); // 安全複製
key.exponent[0] = 0x00;
key.exponent[1] = 0x01;
key.exponent[2] = 0x00;
key.exponent[3] = 0x01;

關鍵點

  1. **陣列成員不可直接整體賦值**:`key.modulus = gbszPublicKey;` 編譯錯誤。
  2. **`memcpy` 優於 `strcpy`**:`modulus` 為 `uint8_t` (二進制資料),可能包含 `\x00`,`strcpy` 會提前截斷。`memcpy` 指定長度複製完整 256 字節。
  3. **長度檢查**:確保 `sizeof(key.modulus) == 256` (或 `MAX_RSA_MODULUS_LEN`),避免緩衝區溢出。
  4. **大端/小端**:RSA 模數通常為大端序,若 `gbszPublicKey` 來源為小端,需逐字節反轉。

總結:靜態常量用初始化列表;動態資料用 memcpy 逐成員賦值。

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