給二維陣列指標擴容

2021-09-24 09:56:12 字數 3464 閱讀 3558

參考:

參考:參考:

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 ...