C 動態開闢二維陣列及memset 的應用

2021-08-29 10:16:52 字數 1079 閱讀 4534

在c++中要動態地開闢陣列,需要使用new,那麼如果要開闢m行n列的二維陣列呢?需要我們首先開闢乙個長度為m的指標陣列,然後對於每個指標開闢乙個長度為n的陣列:

int **a = new int *[m];

for(int i = 0; i < m; i++)

如果這時我想讓陣列的每個值都為0呢?如何使用memset()?

如果只想通過一次呼叫就達到你的目的,那就錯了。首先我們看一下memset()的函式原型:

void *memset(void *s, int ch, size_t n);

函式解釋:將s中當前位置後面的n個位元組(typedef unsigned int size_t)用ch替換並返回s。

需要注意的是memset作用於當前位置後的n個位元組,意味著這是一塊連續的記憶體空間。而你每次用new開闢陣列時並非連續(但new出來的一維陣列是連續的),所以這就是錯誤所在。那麼我們的做法可以是這樣:

int **a = new int *[m];

for(int i = 0; i < m; i++)

與此對應的,如果我們不再需要這些陣列,如何釋放呢?看**:

for(int i = 0; i < m; i++)
這裡有個很重要的問題:無論是free還是delete,僅釋放指標所指的記憶體空間與指標指向的物件,並未將指標置為null,即指標會成為乙個野指標。如果不將其賦為null,則在後續操作中可能會出現意想不到的錯誤。

另一種方式:

說是另一種方式,實質上是把二維陣列當成一維陣列來開闢的。

int *p = new int [m * n];
如果訪問第i行第j列的元素,可以通過a[i * n + j]的方式來訪問。

其實兩種方式的優缺點一看就明白:第一種方式開闢和釋放陣列時麻煩了一些,但是訪問容易;第二種開闢和釋放很簡單,new的次數少,但是不易理解。

至於要選擇哪一種,還是看個人喜好,任君選擇吧~

動態開闢二維陣列

近日寫到乙個程式,用到了要動態開闢二維陣列,一想,自己就會兩種。一者 用new在堆上開闢 二者 用vector開闢。技巧沒有多少,但是確實是折騰了我半天!首先,大家去網上搜一下,動態開闢二維陣列的文章特別多,再加上我這篇就更多了,我本不想寫這篇博文的。但看了網上各位 大蝦 大牛 寫的,覺得還是有必要...

動態開闢二維陣列,初始化二維陣列指標

動態開闢二維陣列主要有兩種方法 1 用new在堆上開闢 2 用vector開闢。比如用new開闢 int output new int row for int i 0 i 用delete銷毀記憶體空間,一定要記得 for i 0 i row i delete output output null 比...

c 二維動態陣列

很多時候,我們無法得知或者不用去考慮程式在執行時需要建立多大的陣列,此時動態資料的建立就會顯得格外重要了,二維動態陣列具有很高的靈活性和實用性,廢話不多說,原始碼呈上!其中包括了一些vs記憶體檢測的語句,大家看注釋吧 include include using namespace std ifdef...