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

C語言動態陣列實現:malloc與free完整指南

     編輯:C 語言問答

動態陣列:解決編譯期大小不確定問題

在C語言中,若陣列大小需由使用者執行時輸入決定,靜態陣列(如 int arr[n])在C89標準下不合法。解決方案是使用動態記憶體分配函數 malloc()、calloc()、realloc() 及釋放函數 free()。

一維動態陣列範例

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, *arr, i;
    printf("請輸入陣列大小: ");
    scanf("%d", &n);
    
    // 分配記憶體
    arr = (int*)malloc(n * sizeof(int));
    if(arr == NULL) {
        printf("記憶體分配失敗\n");
        return 1;
    }
    
    // 使用陣列
    for(i = 0; i < n; i++) arr[i] = i * 2;
    for(i = 0; i < n; i++) printf("%d ", arr[i]);
    
    // 釋放記憶體
    free(arr);
    return 0;
}

二維動態陣列實現(指標陣列法)

int **matrix;
int rows = 3, cols = 4, i, j;

// 分配行指標陣列
matrix = (int**)malloc(rows * sizeof(int*));
for(i = 0; i < rows; i++) {
    // 為每行分配列空間
    matrix[i] = (int*)malloc(cols * sizeof(int));
}

// 初始化與使用
for(i = 0; i < rows; i++)
    for(j = 0; j < cols; j++)
        matrix[i][j] = i + j;

// 釋放:先釋放每行,再釋放行指標陣列
for(i = 0; i < rows; i++) free(matrix[i]);
free(matrix);

關鍵注意事項

  • 必須包含 <stdlib.h> 標頭檔
  • 分配後檢查指標是否為 NULL 防止記憶體不足
  • 使用完畢必須 free() 釋放,避免記憶體洩漏
  • C99標準支援變長陣列(VLA),但棧空間有限,大陣列仍建議用堆分配

進階:連續記憶體二維陣列

為提升緩存命中率,可一次性分配連續空間:

int *matrix = (int*)malloc(rows * cols * sizeof(int));
// 訪問:matrix[i * cols + j]

此法分配/釋放僅需一次呼叫,適合高效能計算場景。

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