iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
佛心分享-IT 人自學之術

C++探險家系列 第 18

Day 18 動態記憶體

  • 分享至 

  • xImage
  •  

首先,先說明動態記憶體配置
動態記憶體配置是一種在程式運行時根據需求管理記憶體的技術,主要用於處理不確定大小的數據結構,如鏈表、樹或動態陣列。透過標準庫函數(malloccallocreallocfree),開發者可以靈活地分配和釋放記憶體。

關鍵概念

  • 記憶體管理:動態記憶體讓程序在執行過程中根據需要增減記憶體使用,有助於提高資源利用率。
  • 指標操作:使用指標來引用動態分配的記憶體,必須小心處理以避免錯誤。
  • 記憶體洩漏:如果分配的記憶體未被釋放,將導致記憶體洩漏,影響程式性能和穩定性。
  • 錯誤處理:在進行記憶體分配時,應檢查返回值是否為 NULL,以確保分配成功,避免在空指標上進行操作。

應用場景

動態記憶體配置廣泛應用於需要靈活數據結構的情況,如:

  • 實現可變大小的陣列。
  • 動態生成鏈表、樹或圖等結構。
  • 處理大型數據集,當大小不明時。

動態記憶體配置是C語言中一個強大且靈活的功能,但需要謹慎使用,以確保程序的穩定性和性能。

程式練習(字串結合):

#include ‹stdio.h>
#include <stdlib.h>
#include <string.h>
05: int main (void)
{
    int i=0, j=0;
    string s1, s2, *p;
    cin>>s1>>s2;
    p = (char*) malloc ((strlen(s1) +strlen (s2) +1) *sizeof (char)) ;
    while (* (s+i)) {
      * (p+i) = * (s1+i) ;
        i++;
}
    while (* (s2+j)) 1
     *(p+i) = * (s2+j) ;
     i++; j++;
}
    * (p+i) = '\0';
    puts (p) ; 
    free (p) ; 
    return 0;
}

說明:
這段程式碼的目的是將兩個字串 s1s2 連接起來。首先,程式使用 malloc 動態分配足夠的記憶體以儲存連接後的字串。接著,透過兩個 while 迴圈,將 s1s2 的字符逐個複製到分配的記憶體中,並在最後加上字串結尾符 '\0'。最後,使用 puts 輸出結果,並呼叫 free 釋放動態分配的記憶體,以防止記憶體洩漏。

程式練習(費氏數列):

#include <iostream>
using namespace std;

int f(int n, int cache[]);

int main() {
    int i, n, *cache;
    cin >> n;
    cache = new int[n + 1]; 
    for (i = 0; i <= n; i++)
        cache[i] = 0; 

    cout << "F(" << n << ") = " << f(n, cache) << "\n";
    
    delete[] cache; 
    return 0;
}

int f(int n, int cache[]) {
    if (cache[n] == 0) {
        if (n == 0 || n == 1)
            return 1;
        else
            cache[n] = f(n - 1, cache) + f(n - 2, cache); 
    }
    return cache[n]; 
}

說明:
main 函數中,程式首先讀取用戶輸入的整數 n,並動態分配一個大小為 n + 1 的整數陣列 cache,用於存儲計算結果,然後初始化所有元素為0。接著,調用遞歸函數 f 計算第 n 個數,該函數使用緩存技術來避免重複計算,並返回結果。最後,程式輸出計算結果並釋放分配的記憶體。整體上,這段程式碼有效利用了記憶體和遞歸方法來優化數列的計算。

!!以上內容是跟著第一次學C++就上手第二版第13章一起做學習!!


上一篇
Day 17 程式練習
下一篇
Day 19 類別
系列文
C++探險家30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言