# 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]);
}
}
```
**輸出結果:**

:::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); //釋放記憶體
}
```
**執行結果:**

## 重點筆記
>**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開始計算
:::

## 總結
以上就是C語言中動態記憶體和動態陣列的小筆記,很久沒寫這類的技術文章,有些地方表達的沒有很好,請多多包涵,也希望這篇文章能幫助到你們,祝各位同學學習愉快,考試滿分,學分歐趴!!!