參考:
參考:參考:
postgres全部由純c編寫,現在要給乙個指標陣列賦值,但是因為由陣列上限要求,所以就和vector那樣,需要動態的給二維陣列擴容。如果寫了擴容方法,如果對函式中的指標重新分配記憶體,就會導致函式中的指標和實參變化。如下:
#include #include const int max = 2;
typedef struct node
}node;
static int enlarge_capcity(int capcity)//擴容 確定新的容量大小
static void enlarge(char **outer_array, int outer_length, int *capcity)//重新申請陣列擴容
*capcity = enlarge_capcity(*capcity);
outer_array= (char**)malloc(sizeof(char*)**capcity);
for (int i = 0; i < outer_length; i++)
for (int i = 0; i < outer_length; i++)
for (int i = 0; i < outer_length; i++)
free(temp);
temp = null; }
int main()
for (int i = 0; i < outer_length; i++)
free(outer_array);
outer_array = null;
std::cout << "hello world!\n";
return 0;
}
長度:2 容量:2
0 01 1
長度:2擴容容量:4
長度:4 容量:4
0 01 1
2 23 3
長度:4擴容容量:8
長度:8 容量:8
0 01 1
2 23 3
4 45 5
6 67 7
長度:8擴容容量:16
修改有兩種方法,一種使用realloc,還有一種是,為了改變char**,引數中就要寫char***,但是這個就比較麻煩。
int **a, i;
a=(int**) malloc(sizeof(int*)*100);
for(i = 0; i < 100; i ++)
a[i] = (int*)malloc(sizeof(int)*2);
//以上 第一次申請完畢, 為a[100][2]
a=(int**) realloc(a, sizeof(int*)*150);//擴大到150
//由於realloc可以保證前面部分值不變,所以 前100個不動。
for(i = 100; i < 150; i ++)
a[i] = (int*)malloc(sizeof(int)*2);
利用上面兩個方法,擴容程式編寫成功
static void enlarge(char ***outer_array, int outer_length, int *capcity)//重新申請陣列擴容
}
最終**
// 字元陣列拷貝.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include "pch.h"
#include #include #define array (char **)
const int max = 2;
typedef struct node
}node;
static int enlarge_capcity(int capcity)//擴容 確定新的容量大小
static void enlarge(char ***outer_array, int outer_length, int *capcity)//重新申請陣列擴容 }
int main()
for (int i = 0; i < outer_length; i++)
free(outer_array);
outer_array = null;
std::cout << "hello world!\n";
return 0;
}// 執行程式: ctrl + f5 或除錯 >「開始執行(不除錯)」選單
// 除錯程式: f5 或除錯 >「開始除錯」選單
// 1. 使用解決方案資源管理器視窗新增/管理檔案
// 2. 使用團隊資源管理器視窗連線到源**管理
// 3. 使用輸出視窗檢視生成輸出和其他訊息
// 4. 使用錯誤列表視窗檢視錯誤
// 5. 轉到「專案」>「新增新項」以建立新的**檔案,或轉到「專案」>「新增現有項」以將現有**檔案新增到專案
// 6. 將來,若要再次開啟此專案,請轉到「檔案」>「開啟」>「專案」並選擇 .sln 檔案
長度:2 容量:2
0 01 1
長度:2擴容容量:4
長度:4 容量:4
0 01 1
2 23 3
長度:4擴容容量:8
長度:8 容量:8
0 01 1
2 23 3
4 45 5
6 67 7
長度:8擴容容量:16
0 01 1
2 23 3
4 45 5
6 67 7
8 89 9
hello world!
c:\users\ysa10\source\repos\字元陣列拷貝\debug\字元陣列拷貝.exe (程序 18112)已退出,返回**為: 0。
若要在除錯停止時自動關閉控制台,請啟用「工具」->「選項」->「除錯」->「除錯停止時自動關閉控制台」。
按任意鍵關閉此視窗...
總結:如果想要對二維指標陣列在函式中修改,就需要用三維指標,對指標的修改總要多乙個維度,realloc可以保留之前的空間,重新分配,不過貌似位址有變化,那麼可能會導致之間分配的記憶體洩漏,後來看csdn論壇上有人說,不用擔心,最後一次釋放就ojbk了。
保證釋放最後1次realloc()返回的指標就可以了。
realloc()如果成功回返回成功的位址,注意可能和舊位址已經不同了。
如果失敗返回null,這個時候舊位址依舊可用,請注意舊位址不要被null覆蓋了。
realloc記憶體洩漏:
最後postgres的修改程式就兩行,非常簡潔
static void enlarge(char ***outer_array, int outer_length, int *capcity)//重新申請陣列擴容
給函式傳遞二維陣列指標
很多時候,函式的形參很容易定義為指標的指標形式 如 int number 這樣可用來表示指向整型指標的指標,但我們傳遞的可是乙個二維陣列,其指標該是指向整型陣列的指標。這就是容易出現模糊的點。那如果形參形式是 int number 這種形式也是有其優點的,從例子中來說明 先定義實參 int inpu...
C 二維陣列 取位址 複製給 二維指標
本來應該是個簡單的問題,但是我就不明白了,為什麼會段錯誤了。include define uint32 unsigned intuint32 ntype1 xy 11 2 intmain 提示aaaa.cpp in function int main aaaa.cpp 11 9 error cann...
二維陣列 二維陣列和指標
include using namespace std int main 如上面這段程式所示,通過取位址符 指標 p 獲得了變數 a 的位址,那麼解引用符 就可以從 p 中得到變數 a 的值。也就是說,p a和 p a是等價的。p 是變數 a 的位址,從 p 中就可以取出 a 的值。反之,能從 p ...