2011-08-23

C++ 動態配置多維陣列

在C++中,配置與釋放一般陣列的語法如下:


//allocate memory block
int *test = new int[5];
//free memory
delete [] test;
test = NULL;

要動態配置多維陣列,就必須先由第一維開始配置存放下一維指標陣列,
然後再各自往下配置,以此類推...        
刪除的方法類似,反向操作即可。

宣告一個 int test[3][4][5] 的陣列。
int ***test;
test = new int**[3];
//allocate memory block
for(int i=0; i<3; i++)
{
     test[i] = new int*[4];
     for(int j=0; j<4; j++)
     {
         test[i][j] = new int[5];
     }
} 

//free memory
for(int i=0; i<3; i++)
{
      for(int j=0; j<4; j++)
     {
         delete [] test[i][j];
         test[i][j] = NULL;
    }     
    delete [] test[i];
    test[i] = NULL;
}
delete [] test;
test = NULL;

Socket Programming in C 常犯小毛病

在這個網路程式範例,似乎有滿多人不經意的這樣寫

 

char tmp[32];
memset( tmp, '\0', sizeof(tmp));
int ret = recv( sock, tmp, sizeof(tmp), 0 );
printf("%s\n", tmp)

把 buffer 填滿固然是一件好事,但是字串填滿之後,結果沒有\0了
就會發生意想不到的事情,可能會出現程式記憶體存取違規的問題
( 字元陣列的結尾正常結束都要有個 \0 才是正確的 )

假設我們不看 ret 回傳收到多大的資料,考慮使用 strcat 來把回傳的 buffer
串到更大的 buffer 字元陣列,應該要扣掉1來使用,避免發生記憶體存取違規!

char tmp[32];
int ret;
if( (ret = recv( sock, tmp, sizeof(tmp) - 1, 0 ) ) > 0 ) {
        tmp[ret] = 0x0;
        printf("%s\n", tmp);
}

如果字元陣列尾端沒有 \0 就會引起 Access Violation 記憶體存取違規。