2009-05-01 43 views
0

這是類似於我已經定義了一個函數:C++ - 傳遞數組的方法

void Function(BYTE *data); 

我想什麼做的是這樣的:

Function(new BYTE { 0x00, 0x00 }); 

回答

6

不能使用使用new動態分配數組的數組初始化語法。你可以這樣做:

BYTE *ary=new BYTE[2]; 
ary[0] = 0; 
ary[1] = 0; 
Function(ary); 
delete [] ary; 

但是,爲什麼你在這裏使用動態分配的內存?數組是否保持在當前函數的範圍之外?如果沒有,則可以使用在棧上分配的數組:

BYTE ary[2] = {0}; 
Function(ary); 

在C++中,優選的方法是使用STL類std::vector,其作用就像一個動態分配的(但類型安全)陣列:

std::vector<BYTE> ary(2); 
Function(&ary[0]); 
0

好吧,如果一個字節是一個類,你可以有一個構造函數

BYTE::BYTE(char c1,char c2){ 
//something here. 
} 

,然後調用

Function(new BYTE(0X00,0X00)) 

但是,這是容易泄漏的。在退出函數之前,您應該刪除參數。而這並不總是可能的(例如,如果你不具備功能的源)

+0

我會樂意在這裏出門,建議「BYTE」不是一個班的名字。雖然 – 2009-05-01 04:14:57

+0

@ 1800,但在盒子外面思考的很好。可能是正確的。也許它可以作爲一個包裝器發揮可能的解決方案? – Tom 2009-05-01 04:59:28

+0

在函數重載的幫助下,我相信沒有什麼能夠防止隱式使用智能指針來處理刪除操作。 – 2009-05-01 09:53:04

5
BYTE foo[] = { 0x00, 0x00 }; 
Function(foo); 

的C++ 0x將引入初始化列表語法,將允許一些靠近你上面想要的東西。

0

輔助功能;

BYTE* makeNaryByteArray(int n, BYTE exemplar = 0) { 
    BYTE* r = new BYTE[ n ]; 
    for(int i = 0 ; i < n ; ++i) 
     n[i] = exemplar; 
    return r; 
    } 

    //call them: 
    BYTE* myByteArray; 
    Function(myByteArray = makeNaryByteArray(2)); 

    // done with array: 
    delete[] myByteArray; 

只要記住,用new[]創建的陣列與delete[]刪除;

2
#include <windows.h> 
#include <iostream> 
using namespace std; 
void foo(BYTE *d) { 
    cout << (int)d[ 0 ] << " " << (int)d[ 1 ] << endl; 
} 
int main(void) 
{ 
    foo(new BYTE[ 2 ]()); 
    return 0; 
} 

上述的工作,如果你只是想要初始化​​數組全部爲零。 (我假設這是Windows​​類型。)但是,如上所述,這很容易泄漏,最好避免。

1

GCC有所謂的「複合文字」的延伸,它允許你寫:

Function((BYTE[]){1, 2, 3, 4}); 

請注意,這是在棧上分配的,所以它可能不適合你的目的。