我想在函式中利用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);
}
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 (異常狀況) |
簡單來說就是下方主程式中第二行和第四行的寫法會影響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;
}