# C語言動態記憶體小筆記 ## 何謂動態記憶體 最常使用動態陣列記憶體配置的情形,是當事先無法得知資料大小時,必須在程式執行時才能決定的狀況下,才有必要配置記憶體。 ## 動態記憶體語法 在C語言中,使用 **malloc()** 和 **free()** 兩種函式來配置動態記憶體 而在C++中,則是用**new**和**delate**來配置動態記憶體。 >語法介紹 :::info 型態 *指標變數; 指標變數=(型態*) malloc(所需記憶體byte數量); <font color="FF0000">**任何型態的指標變數所佔用的記憶體空間皆為4bytes**</font> ::: 程式碼(C語言為範例): ```C= #include"stdlib.h" //一開始必須要添加這行來引入此函式庫,否則無法編譯執行 int *ptr; //宣告指標變數ptr ptr=(int *) malloc(12); //配置配置3個整數空間12bytes ``` >動態陣列寫法 程式碼(C語言為範例): ```C= #include"stdlib.h" //一開始必須要添加這行來引入此函式庫,否則無法編譯執行 int *array; //宣告指標變數array array = (int *)malloc(3 * sizeof(int)); //配置3個整數空間12bytes(陣列) ``` ## 例題介紹 >題目:動態陣列(一維) >試撰寫一程式,讀入一維整數陣列的元素個數(輸入第1列的數值)和所有元素值(輸入第2列開始的數值),並回傳一維陣列的所有奇元素和(使用動態陣列撰寫) :::success 輸入1:5 輸入2:1 2 3 4 5 輸出:9 **例題說明: 陣列個數:5 陣列值:1 2 3 4 5** ::: ### 第一步 一開始先載入標頭檔和主函式: ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { //Your Code } ``` ### 第二步 先處理第一個輸入,輸入值取決於陣列大小: ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { int num; //宣告整數型態變數num scanf("%d", &num); //輸入一個值並將值指向num } ``` ### 第三步 撰寫動態陣列,並配置陣列的動態記憶體: ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { //處理第一個輸入值 int num; //宣告整數型態變數num scanf("%d", &num); //輸入一個值並將值指向num (輸入num=5) int *array; //宣告一個指標變數array /* 1.使用malloc函數動態分配了int陣列,並存在指標變數array 2.sizeof()是拿來取大小,單位為bytes 3.這個陣列大小是5個整數,每個整數4bytes */ array = (int *)malloc(num * sizeof(int)); //配置5個整數空間20bytes(陣列) //int *array = (int *)malloc(num * sizeof(int)); //也可以直接這樣寫 } ``` ### 第四步 使用迴圈輸入陣列值: ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { //處理第一個輸入值 int num; //宣告整數型態變數num scanf("%d", &num); //輸入一個值並將值指向num (輸入num=5) int *array; //宣告一個指標變數array /* 1.使用malloc函數動態分配了int陣列,並存在指標變數array 2.sizeof()是拿來取大小,單位為bytes 3.這個陣列大小是5個整數,每個整數4bytes */ array = (int *)malloc(num * sizeof(int)); //配置5個整數空間20bytes(陣列) //int *array = (int *)malloc(num * sizeof(int)); //也可以直接這樣寫 for (int i = 0; i < num; i++) { //i初始值為0,i小於num值的時候,i會+1 scanf("%d", &array[i]); //輸入陣列值 } } ``` >For迴圈理解 範例程式: ```C= //[1,2,3,4,5] 假設陣列裡面的值是這樣 //[0,1,2,3,4] 程式語言中,是從0開始計算 #include"stdio.h" int main(){ int array[5]; printf("輸入陣列值:"); for(int i=0;i<5;i++){ scanf("%d",&array[i]); printf("i=%d,陣列值=%d\n",i,array[i]); } } ``` **輸出結果:** ![輸出結果](https://imgur.com/xDSHOLe.png) :::info :bulb:所以我們把**i**的初始值設為0,這樣**i**的範圍是(n-1)。**n=5,i=0~4** ::: ### 第五步 判斷奇數,並處理奇數和: ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { //處理第一個輸入值 int num; //宣告整數型態變數num scanf("%d", &num); //輸入一個值並將值指向num (輸入num=5) int *array; //宣告一個指標變數array /* 1.使用malloc函數動態分配了int陣列,並存在指標變數array 2.sizeof()是拿來取大小,單位為bytes 3.這個陣列大小是5個整數,每個整數4bytes */ array = (int *)malloc(num * sizeof(int)); //配置5個整數空間20bytes(陣列) //int *array = (int *)malloc(num * sizeof(int)); //也可以直接這樣寫 int sum = 0; //宣告整數型態變數sum,並初始化為0 for (int i = 0; i < num; i++) { //i初始值為0,i小於5的時候,i會+1 scanf("%d", &array[i]); //輸入陣列值 if (array[i] % 2 != 0) { //如果陣列裡的值除以2的餘數不等於0,就是奇數 sum += array[i]; //把判斷完的數加總起來並賦予sum } } } ``` ### 第六步 印出結果並釋放記憶體(完整程式碼) ```C= #include <stdio.h> #include <stdlib.h> //必須要添加這行來引入此函式庫,否則無法編譯執行 int main() { //處理第一個輸入值 int num; //宣告整數型態變數num printf("輸入陣列個數:"); scanf("%d", &num); //輸入一個值並將值指向num (輸入num=5) int *array; //宣告一個指標變數array /* 1.使用malloc函數動態分配了int陣列,並存在指標變數array 2.sizeof()是拿來取大小,單位為bytes 3.這個陣列大小是5個整數,每個整數4bytes */ array = (int *)malloc(num * sizeof(int)); //配置5個整數空間20bytes(陣列) //int *array = (int *)malloc(num * sizeof(int)); //也可以直接這樣寫 int sum = 0; //宣告整數型態變數sum,並初始化為0 printf("輸入陣列值(空格區分):"); for (int i = 0; i < num; i++) { //i初始值為0,i小於5的時候,i會+1 scanf("%d", &array[i]); //輸入陣列值 if (array[i] % 2 != 0) { //如果陣列裡的值除以2的餘數不等於0,就是奇數 sum += array[i]; //把判斷完的數加總起來並賦予sum } } printf("奇數和=%d",sum); //印出奇數和的結果 free(array); //釋放記憶體 } ``` **執行結果:** ![執行結果](https://imgur.com/wojTEbh.png) ## 重點筆記 >**1.動態記憶體語法:** :::info 型態 *指標變數; 指標變數=(型態) malloc(所需記憶體byte數量); ::: >> 單純指標 ```C= int *ptr; ptr = (int *)malloc(12); //配置3個整數空間12bytes ``` >>陣列 ```C= int *array; array = (int *)malloc(num * sizeof(int)); ``` >2.**最後一定要釋放記憶體** ```C= free(指標變數名稱) ``` >3.**陣列索引值** :::info [1,2,3,4,5] 假設陣列裡面的值是這樣 [0,1,2,3,4] 程式語言中,是從0開始計算 ::: ![輸出結果](https://imgur.com/xDSHOLe.png) ## 總結 以上就是C語言中動態記憶體和動態陣列的小筆記,很久沒寫這類的技術文章,有些地方表達的沒有很好,請多多包涵,也希望這篇文章能幫助到你們,祝各位同學學習愉快,考試滿分,學分歐趴!!!