iT邦幫忙

1

函式中的double pointer使用動態記憶體分配

  • 分享至 

  • xImage

我想在函式中利用calloc動態記憶體配置一個double pointer,然後這個double pointer需要像一維陣列一樣可以存一些數字,自己想了很久都做不對,想向各位請教一下。(下方是我的作法)

void mem_calloc(int **pptr)
{
    int size = 3;
    *pptr = (int *)calloc(size,sizeof(int));
}

另外想問一下,當我要在主程式呼叫這個函式時,參數代pointer的位置和代double pointer這個變數,函式中的寫法會有差嗎?(簡單來說就是下方主程式中第二行和第四行的寫法會影響mem_calloc這個函式的內容嗎?)

void mem_calloc(int **pptr);
int main()
{
    int *ptr;
    mem_calloc(&ptr);
    int **pptr;
    mem_calloc(pptr);
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
淺水員
iT邦大師 6 級 ‧ 2022-12-25 15:28:03
最佳解答

狀況一

int *ptr;
箱子名稱 箱子編號 內容物
ptr 001 未知
// 有取址符號「&」是給「箱子編號」,相當於 mem_calloc(001);
mem_calloc(&ptr);

就會把動態宣告的結果放到 001 號的箱子了

箱子名稱 箱子編號 內容物
ptr 001 002
(動態宣告的) 002 calloc 初始化為 0

狀況二

int **pptr;
箱子名稱 箱子編號 內容物
pptr 001 未知
// 無取址符號「&」是給「內容物」,相當於 mem_calloc(未知);
mem_calloc(pptr); 

這會把動態宣告的結果放到「未知編號」的箱子

箱子名稱 箱子編號 內容物
pptr 001 未知
(動態宣告的) 002 calloc 初始化為 0
(未知) 未知 002 (異常狀況)
1
JamesDoge
iT邦高手 1 級 ‧ 2023-01-10 00:18:15

簡單來說就是下方主程式中第二行和第四行的寫法會影響mem_calloc這個函式的內容嗎?

void mem_calloc(int **pptr);
int main()
{
    int *ptr;
    mem_calloc(&ptr);
    int **pptr;
    mem_calloc(pptr);
}

第二行,你正確地傳入了一個pointer,它將被用來存放動態記憶體配置的整數陣列的起始位址。

但是在第四行中,你傳入的是一個double pointer,但它並沒有被初始化指向任何有意義的記憶體位址。因此,當你在函式中將它指向一個動態記憶體配置的整數陣列時,主程式中的pptr變數並沒有被改變。

如果你希望在主程式中的pptr變數指向動態記憶體配置的整數陣列,你需要將它初始化為一個指向記憶體位址的pointer,然後再將它傳入函式中,例如:

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

// 定義函式 mem_calloc,接收一個 double pointer 作為參數
void mem_calloc(int **pptr)
{
    // 定義陣列的大小
    int size = 3;

    // 使用 calloc 動態配置記憶體,並將 double pointer 指向起始位址
    *pptr = (int *)calloc(size, sizeof(int));
}

int main()
{
    // 定義一個 pointer 變數 ptr
    int *ptr;

    // 呼叫函式 mem_calloc,傳入 ptr 的位址
    mem_calloc(&ptr);

    // 將 ptr 賦值給 array
    int *array = ptr;

    // 將 array 的位址賦值給 double pointer pptr
    int **pptr = &array;

    // 再次呼叫函式 mem_calloc,傳入 pptr
    mem_calloc(pptr);

    // 印出 pptr 所指向的位址
    printf("pptr: %p\n", *pptr);

    // 印出 pptr 所指向的記憶體位址中的數值
    printf("*pptr[0]: %d\n", (*pptr)[0]);
    printf("*pptr[1]: %d\n", (*pptr)[1]);
    printf("*pptr[2]: %d\n", (*pptr)[2]);

    // 使用 free 釋放動態配置的記憶體
    free(*pptr);

    return 0;
}

我要發表回答

立即登入回答