Dynamic Memory Allocation

洪翠憶

以下內容為複習&附錄

Array with Pointer

declare a pointer to an array

宣告指標陣列

int *p[10];
int (*q)[10];

*𝐩[10] vs (*𝐩)[10]

#include <iostream>

int main(){
    int *p[5];
    int (*q)[5];
    int r[5] = {2, 4, 6, 8, 10};
    std::cout << sizeof(p) << ' ' << sizeof(q) << ' ' << sizeof(r) << "\n\n";

    //---------------------------
    for(int i=0;i<5;i++){
        std::cout << p[i] << ' ';
    }
    std::cout << '\n';
    for(int i=0;i<5;i++){
        std::cout << q[i] << ' ';
    }
    std::cout << '\n';
    for(int i=0;i<5;i++){
        std::cout << &r[i] << ' ';
    }
    std::cout << "\n\n";

    //---------------------------

    for(int i=0;i<5;i++)
        p[i] = r+i;
    q = &r;
    for(int i=0;i<5;i++){
        std::cout << *p[i] << ' ';
    }
    std::cout << '\n';
    for(int i=0;i<5;i++){
        std::cout << (*q)[i] << ' ';
    }
    std::cout << '\n';
    for(int i=0;i<5;i++){
        std::cout << r[i] << ' ';
    }
    std::cout << "\n\n";

    return 0;
}

現在來試著宣告看看指標陣列吧!

(5 min)

2D Array with Pointer

Assign a 2D array by Using Pointer

建立二維指標陣列

int *p[大小][大小];
int (*q)[大小][大小];

Example

#include <iostream>

int main(){
    int arr[3][4] = {
        3, 6, 2, 7,
        3, 6, 4, 5,
        2, 6, 8, 9
    };
    int *p[3][4];
    int (*q)[3][4] = &arr;

    for(int i=0;i<3;i++)
        for(int j=0;j<4;j++)
            p[i][j] = &arr[i][j];

    std::cout << *p[0][0] << ' ' << *p[0][1] << ' ' << *p[0][2] << ' ' << *p[0][3] << '\n';
    std::cout << *p[1][0] << ' ' << *p[1][1] << ' ' << *p[1][2] << ' ' << *p[1][3] << '\n';
    std::cout << *p[2][0] << ' ' << *p[2][1] << ' ' << *p[2][2] << ' ' << *p[2][3] << "\n\n";

    std::cout << (*q)[0][0] << ' ' << (*q)[0][1] << ' ' << (*q)[0][2] << ' ' << (*q)[0][3] << '\n';
    std::cout << (*q)[1][0] << ' ' << (*q)[1][1] << ' ' << (*q)[1][2] << ' ' << (*q)[1][3] << '\n';
    std::cout << (*q)[2][0] << ' ' << (*q)[2][1] << ' ' << (*q)[2][2] << ' ' << (*q)[2][3] << '\n';

    return 0;
}

接下來的內容:

Allocate a 2D array Dynamically

建立動態二維陣列

//建立
int **指標變數 = new int*[縱軸大小];
for(int i=0;i<縱軸大小;i++)
    指標變數[i] = new int[橫軸大小];
    
//刪除
for(int i=0;i<縱軸大小;i++)
    delete [] 指標變數[i];
delete [] 指標變數;

看不懂嗎?沒關係我也是

Example

#include <iostream>

int main(){
    //p[3][4]
    int **p = new int*[3];
    for(int i=0;i<3;i++)
        p[i] = new int[4];

    for(int i=0;i<3;i++)
        for(int j=0;j<4;j++)
            p[i][j] = i * 4 + j;

    std::cout << p[0][0] << ' ' << p[0][1] << ' ' << p[0][2] << ' ' << p[0][3] << '\n';
    std::cout << p[1][0] << ' ' << p[1][1] << ' ' << p[1][2] << ' ' << p[1][3] << '\n';
    std::cout << p[2][0] << ' ' << p[2][1] << ' ' << p[2][2] << ' ' << p[2][3] << '\n';

    for(int i=0;i<3;i++)
        delete [] p[i];
    delete [] p;
    return 0;
}
/*
0 1 2 3
4 5 6 7
8 9 10 11
*/

試著用上述方法建立二維陣列吧!

(到16:00)

務必要記得delete喔

二維動態配置陣列聽得懂的話真的很電ヽ(°〇°)ノ

Introduction of DYNAMIC MEMORY ALLOCATION

其實這頁講得差不多了www

  • C++:𝐧𝐞𝐰/𝐝𝐞𝐥𝐞𝐭𝐞

  • C:𝐦𝐚𝐥𝐥𝐨𝐜/𝐟𝐫𝐞𝐞

  • 配置失敗時會回傳NULL

if(指標變數 == NULL)
	return -1;

→可以這樣檢查記憶體是否配置成功

*指標變數 = 值;

直接對著指標變數用取值符號(*)就能給值了。取值的時候也是用*就能取了→

new / delete

Syntax

new語法

int *p = new int(10);

delete p;

型態

指標名稱

型態 *指標名稱 = 𝐧𝐞𝐰 型態(初始值);

(初始值)

前後要一致

非必填

型態

Syntax

delete語法

int *p = new int(10);

delete p;

𝐝𝐞𝐥𝐞𝐭𝐞 指標變數;

指標變數

一定要記得delete自己動態配置的記憶體!!!!!

Example

例子

#include <iostream>

int main(){
    int *p = new int;

    *p = 50;
    std::cout << *p;

    delete p;
    return 0;
}

//50

Syntax

動態記憶體配置陣列

int *p = new int[3];

delete [] p;

不能宣告同時賦值了

型態 *指標名稱 = 𝐧𝐞𝐰 型態[格數];

𝐝𝐞𝐥𝐞𝐭𝐞 [] 指標變數;

Example

例子

#include <iostream>

int main(){
    char *sky = new char[10];
    char *ground = new char[12];
    for(int i=0;i<12;i++){
        if(i < 10)
            sky[i] = i + 97;
        ground[i] = i + 65;
    }
    int *year = new int;
    std::cin >> *year;

    std::cout << sky[(*year - 4) % 10] << ground[(*year - 4) % 12];

    delete year;
    delete [] sky;
    delete [] ground;
    return 0;
}

現在來試著實作動態記憶體分配吧!

(10 min)

務必要記得delete喔

可以先練習建立一個動態變數,順手了之後再挑戰動態陣列

malloc / free

Syntax

malloc語法

int *p = (int*)malloc(sizeof(int));

free(p);

型態

指標名稱

型態 *指標名稱 = (型態*)𝐦𝐚𝐥𝐥𝐨𝐜(記憶體空間大小);

記憶體空間大小

型態

Syntax

free語法

𝐟𝐫𝐞𝐞(指標變數);

指標變數

一定要記得free自己動態配置的記憶體!!!!!

被發現了
學長都偷懶,用複製貼上的D:
int *p = (int*)malloc(sizeof(int));

free(p);

Syntax

realloc語法

int *q = (int*)realloc(p, sizeof(int) * 2);

型態 *新指標 =

(型態*)𝐫𝐞𝐚𝐥𝐥𝐨𝐜(舊指標, 新記憶體空間大小);

  • 將新的指標配置於舊的上面

  • 起始位置與值不變

雖然C++的new沒有這個語法,但它能輕易達成

Syntax

calloc語法

int *p = (int*)calloc(1, sizeof(int));

型態 *指標名稱 =

(型態*)𝐜𝐚𝐥𝐥𝐨𝐜(陣列格數, 每格的記憶體空間大小);

  • 將每格初始化為0

  • 與𝐦𝐚𝐥𝐥𝐨𝐜的差別是有無給定初始值0

Example

例子

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

int main(){
    int *p = (int*)malloc(sizeof(int));
    printf("%d\n", sizeof(p));

    int *o = (int*)calloc(1, sizeof(int));
    printf("%d %d\n", *p, *o);

    *p = 9;
    printf("%d\n", *p);

    int *q = (int*)realloc(p, sizeof(int) * 2);
    printf("%d\n", *q);

    free(q);
    free(o);
    return 0;
}

/*
4
2035312 0
9
9
*/

Kahoot!

Reference

Dynamic Memory Allocation

By justhentai

Dynamic Memory Allocation

  • 423