1. 程式人生 > >C++二維動態陣列memset()函式初始化

C++二維動態陣列memset()函式初始化

先說說memset函式:

void *memset(void *s,int c,size_t n)
作用:將已開闢記憶體空間 s 的首 n 個位元組的值設為值 c。

memset()的內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為‘ ’或‘/0’;例:char a[100];memset(a, '/0', sizeof(a));

memset() 函式常用於記憶體空間初始化。如:
char str[100];
memset(str,0,sizeof(str));

先說說一維陣列的動態分配和初始化:

一維陣列的動態分配,初始化和撤銷比較簡單,如下所示:

動態分配: int *array=new int [10];//動態分配10個空間

初始化:memset(array,0,sizeof(array));      或者memset(array,0,10*sizeof(int));

撤銷:delete [] array;

下面說說二維陣列:

二維陣列(n行m列)利用new來進行動態分配實際上相當於對n個m元陣列進行動態分配,只不過我們不能一味的按照動態分配一維陣列的方法來這項操作。MSVC目前還沒有這般的人性化,具體應該這樣做:

int **array;
array=new int *[10];
for(int i=0;i<10;i++)
         array[i]=new int [5];


   上面的操作完成了一個10行5列的二維陣列array[10][5]的動態分配,可以看到我們先動態分配了一個10單元的陣列的指標的指標的首地址給**array,然後再對其每個首地址進行遍歷,同時完成一個5單元的陣列的動態分分配,並把首地址給*array[i],從而最終完成了二維陣列array[10][5]的動態分配。我們可以依此類推得到三維以至多維的陣列的動態分配方法。

二維陣列的初始化:如果把一維陣列初始化辦法照搬過來就會發現對於動態分配的二維陣列並不適用。從上面介紹可以看出memset只能作用於一個一維陣列*array因此最好的辦法就是和二維陣列的動態分配結合起來,new一個,memset一個。具體寫法如下:

int **array;
array=new int *[10];
for(int i=0;i<10;i++)

{
         array[i]=new int [5];

        memset(array[i],0,5*sizeof(int));

}

二維陣列的撤銷:

for (int i = 0; i < 10; i ++) {

     delete[] array[i];

    array[i] = NULL;//不要忘記,釋放空間後p[i]不會自動指向NULL值,還將守在原處,只是釋放記憶體而已,僅此而已。

}

delete [] array;

array=NULL;


 

最後說明一個不常用的分配方式:
int (*p)[4] = new int[3][4];


解釋:可能有些初學者認為這樣是可取的,也是利用 new 分配的陣列,就可以是動態的,那你的想法就錯了,它的分配必須得有最外層 const 的支援
int x = 3, y = 4;
int (*p)[y] = new int[x][y];//error,y必須是const。
所以這種方式不能達到真正的動態分配二維陣列的目的,只能相當於半自動化的一個分配方式。

最後提醒:千萬不要有 int *p = new int[4][2]; 這樣的錯誤寫法。

相關推薦

C++動態陣列memset()函式初始

先說說memset函式: void *memset(void *s,int c,size_t n)作用:將已開闢記憶體空間 s 的首 n 個位元組的值設為值 c。 memset()的內涵:用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為‘ ’

c++ 動態陣列初始及作為引數傳遞

學習c++動態二維陣列寫的程式碼,程式已經在VS2010上跑過了,是ok的包括動態二維陣列的建立,初始化,以及作為形參傳遞#include <iostream> #include<vector> using namespace std; typede

C++ 動態陣列建立及越界問題

目前VS2013不支援動態陣列,也就是int a[n], n必須是常量。建立動態陣列可以使用 new 的方法。比如建立一個二維動態陣列: int n; cin>>n; int **matrix=new int*[n];//matrix是一個存放指向

C/C++ 動態陣列的分配和賦值

平臺:Visual Studio 2013 近期找工作中,錯過了阿里和騰訊的筆試,百度的筆試也讓我措手不及。還好有個賽碼網能讓我練練線上筆試題。 最近筆試題總是會除錯不出來,主要是存在著輸入輸出不熟悉以及不知道二維陣列如何建立。 先解決二維陣列的建立問題~ 明晚小米筆試

LeetCode 18 四數之和 (4sum) —— 關於動態陣列初始

本題中,二維動態陣列的初始化。 本題每一行元素的數量是確定的,而不確定有幾列的情況 vector s(4,0);//每一行元素,定義為一維陣列 vector<vector> result;//定義一個二維陣列 //選出每一個s的過程 result.push_back(s);/

程式設計C 實驗五 題目四 動態陣列轉置(0294)

輸入兩個數字分別控制行向量個數和列向量個數。動態生成二維矩陣,對矩陣賦值後將其轉置輸出。 Description 輸入的第一行為了兩個整數m、n,接下來有一個由m*n個數據組成的整數矩陣。 Input 按轉置後的

C++中動態陣列的建立

方法1.用new / delete建立二維動態陣列 程式碼: #include<iostream> #include<vector> using namespace std; #define ROW 2 //行數 #define COLUMN

關於vector動態陣列初始

       很多時候,我們要使用動態陣列來儲存一開始未知數量的資料時,往往都是在程式中得到行數和列數,然後再對陣列進行初始化。可是,如果我們只知道行或者列其中的一個數量,可以進行動態陣列初始化嗎?        答案是可以的。如果我們知道行數,那麼初始化可以如此寫:vec

數組幾種初始的實際引用

及其 數組 div sys oid .com tex print class 二維數組的三種初始化及其使用 用三組數組使用三種不同的賦值方式 public class six5{ public static void main(String []args){

memset函式初始和最短路中的最大值

在最短路中最大值: 最好把最大值設定為0x3f3f3f3f,而非0x7fffffff 理由如下。 #include<stdio.h> #include<string.h>

memset()函式初始問題

以上程式碼執行後,dp陣列的內容為 00000001 00000001 00000001 00000001 轉化為十進位制後不為1  我們在很多程式中都會看到memset(a,127,sizeof(a));這樣的程式碼,127是什麼特別的數字呢?通過基礎的進位制轉換可以得知127的二進位制表示是0111111

C++陣列(一、三)的動態分配new、初始memset和釋放delete

【原文】http://blog.csdn.net/shanzhizi/article/details/7835752 陣列的動態分配、初始化和釋放經常用到,這裡總結一下,尤其是二維陣列 一維陣列 一維陣列的動態分配,初始化和撤銷都好說,幾乎每一本C++教材都會做出詳細的說明

C++陣列動態記憶體分配【轉】

(轉自:https://www.cnblogs.com/Forever-Kenlen-Ja/p/3753566.html)   /*申請3行4列的二維陣列記憶體*/ int **array; array = new int *[3];/*先申請3個int*型

C++ 陣列動態記憶體分配過載以及拷貝構造

總時間限制:  1000ms   記憶體限制:  65536kB // 在此處補充你的程式碼 描述 寫一個二維陣列類 Array2,使得下面程式的輸出結果是: 0,1,2,3, 4,5,6,7, 8,9,10,11, next

C++ 陣列/多陣列動態分配(new)和釋放(delete)

1. 一維陣列 對於簡單的一維陣列動態記憶體分配和釋放,如下:int *array1D;//假定陣列長度為m //動態分配空間 array1D = new int [m]; //釋放 delete [] array1D; 2. 二維陣列 二維陣列的動態分配和釋放//假

C++: 陣列函式引數

自http://blog.csdn.net/hanpingliang/article/details/3380351 變數在作用域裡面被宣告的是什麼型別,就當作什麼型別來用。 (1)引數是二維陣列,但是要指定第二維的維數。 int array[10][10];

c 陣列動態分配和釋放

一、 已知第二維 二、 已知第二維 三、 已知第一維, 一次分配記憶體(保證記憶體的連續性) 四、兩維都未知  五、兩維都未知, 一次分配記憶體(保證記憶體的連續性)    注意:靜態二維陣列作為函式引數傳遞 如果採用上述幾種方法動態分配二維陣列,那

C#陣列的定義,初始(重在理解兩者的區別)

在學習C++基礎知識之後 , 現在學習C#其實簡單很多,但是還是有些不同的,就比如C#中二維陣列的定義、宣告 都 是有所不同的。 下面看看有什麼不同: using System; using System.Collections.Generic; using System

動態建立vector陣列 CC++ 及指標與引用的區別

二維vectorvector<vector <int> > ivec(m ,vector<int>(n));    //m*n的二維vector動態建立m*n的二維vector方法一:vector<vector <int>

c陣列初始化為0的2種實現方式

 1 #include <stdio.h>   2 #include <stdlib.h>   3 #include <string.h>   4 int main()   5 {   6     //char a[2][4] ;   7