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

C與指標第十一章:動態記憶體分配習題解析

     編輯:關於C語言

第十一章 動態記憶體分配(下)習題精解

習題 1:以 malloc 實作 calloc

calloc 需分配 n * size 位元組並歸零。關鍵在於正確處理迴圈與歸零邏輯。

void *calloc(size_t n, size_t size) {
    char *memory = (char *)malloc(n * size);
    if (memory == NULL) return NULL;

    char *ptr = memory;
    while (n-- > 0) {
        *ptr++ = '\0';
    }
    return memory;
}

注意: 原碼迴圈條件有誤,已修正為 n-- > 0 確保正確歸零所有位元組。

習題 2:動態儲存輸入整數序列

使用 realloc 動態擴展陣列,每讀入一個整數即擴充一個 int 大小。

#include 
#include 

int *readints() {
    int *array = NULL;
    int value;
    int length = 0;

    while (scanf("%d", &value) == 1) {
        int *temp = (int *)realloc(array, (length + 1) * sizeof(int));
        if (temp == NULL) {
            free(array);
            return NULL;
        }
        array = temp;
        array[length++] = value;
    }
    return array;  // 呼叫端負責 free
}

改進點: 原碼初始分配 1 個元素再擴充,改為從 0 開始更自然;新增 temp 變數防止 realloc 失敗導致記憶體洩漏。

習題 3:動態儲存輸入字串

逐字元讀取並動態擴展,結尾補 \0。使用 fgets 或 getchar 替代不安全的 gets。

#include 
#include 

char *readstring() {
    char *array = NULL;
    int ch;
    int length = 0;

    while ((ch = getchar()) != EOF && ch != '\n') {
        char *temp = (char *)realloc(array, (length + 1) * sizeof(char));
        if (temp == NULL) {
            free(array);
            return NULL;
        }
        array = temp;
        array[length++] = (char)ch;
    }

    /* 追加結束符 */
    char *temp = (char *)realloc(array, (length + 1) * sizeof(char));
    if (temp == NULL) {
        free(array);
        return NULL;
    }
    array = temp;
    array[length] = '\0';
    return array;
}

關鍵修正: 原碼使用 gets(ptr) 且邏輯混亂,已重寫為安全、標準的逐字元讀取模式。

核心概念回顧

  • malloc:分配未初始化記憶體
  • calloc:分配並歸零
  • realloc:調整已分配區塊大小,可能移動位址,必須用暫存指標接收返回值
  • free:釋放記憶體,釋放後指標不可再用

動態記憶體管理是 C 語言核心難點,掌握「分配→檢查→使用→釋放」完整生命週期,並養成「用暫存指標接 realloc」習慣,能避免絕大多數記憶體錯誤。

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