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

C 語言數組進階筆記:大小計算、初始化技巧、VLA 與高效拷貝

     編輯:關於C語言

1. 數組大小的獲取

C 語言數組不攜帶長度信息,常用兩種方式:

  • 宏定義:#define SIZE 10,統一維護。
  • sizeof 運算符:sizeof(array) / sizeof(array[0])。注意 sizeof 返回 size_t,參與有符號比較時建議強轉 (int) 或 (size_t)。

int a[] = {1,3,4,55,6,7,89,9,0};
for (int i = 0; i < (int)sizeof(a)/sizeof(a[0]); ++i)
    a[i] = 0;

2. 數組初始化的多種姿勢

全零初始化:一句搞定


#define SIZE 100
int a[SIZE] = {0}; // 所有元素自動為 0,C 標準保證

C99 指定初始化器


int a[SIZE] = {[5] = 100, [50] = 49}; // 指定下標賦值,其餘為 0

混合初始化的陷阱


int a[10] = {1,2,3,4,5, [0] = 6, 7, 8};
// 結果:{6,7,8,4,5,0,0,0,0,0}
// 原理:編譯器維護「下一個待初始化下標」,遇到 [0] 重置為 0,後續遞增。

3. 常量數組


const int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

優點:語義明確防誤改、編譯器優化、放入只讀段節省 RAM(嵌入式關鍵)。

4. C99 變長數組(VLA)


int size;
scanf("%d", &size);
int a[size]; // 運行時確定大小,棧上分配
  • 優點:避免過大靜態數組浪費、過小不夠用。
  • 缺點:棧溢出風險、C11 起為可選特性、不可用於結構體成員/全局變量。

5. 數組拷貝:循環 vs memcpy

手寫循環


for (int i = 0; i < SIZE; ++i) b[i] = a[i];

memcpy:底層內存塊拷貝,效率更高


#include <string.h>
memcpy(b, a, sizeof(a)); // 複製整個數組字節

memcpy 通常由編譯器內建優化(向量化指令、展開循環),大數組拷貝優勢明顯。注意:僅適用於 POD 類型,含指針/類對象時需深拷貝。

總結

  • 用宏或 sizeof 管理長度,勿硬編碼魔術數字。
  • 善用 {0}、指定初始化器簡化代碼。
  • const 修飾只讀數組,利於優化與安全。
  • VLA 靈活但謹慎用於大尺寸/遞歸場景。
  • 大塊 POD 數據拷貝首選 memcpy。

本文出自 “kym” 博客,原文地址:https://kymsha.blog.51cto.com/647951/290505

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