C ++ - Передача Массивов Методам
-
03-07-2019 - |
Вопрос
Вот функция, похожая на ту, которую я определил:
void Function( BYTE *data );
То, что я хотел бы сделать, это что-то вроде этого:
Function( new BYTE { 0x00, 0x00 } );
Решение
Вы не можете использовать синтаксис инициализатора массива с динамически распределяемыми массивами, используя 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]);
Другие советы
BYTE foo[] = { 0x00, 0x00 };
Function( foo );
C ++ 0x введет синтаксис списка инициализаторов, который позволит сделать что-то более близкое к тому, что вы хотели выше.
#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;
}
Вышеописанное работает, если все, что вы когда-либо хотели, это инициализировать BYTE
массив со всеми нулями.(Я предполагаю, что это Windows BYTE
введите.) Однако, как уже упоминалось, это может привести к утечке, и этого лучше избегать.
Или вы могли бы использовать многоточие, чтобы имитировать построение вашего массива:
взгляните на это: http://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/
И если вы действительно хотите повозиться до прихода 0x, взгляните на этот код.
gcc имеет расширение под названием "Составные литералы", которое позволяет вам писать:
Function((BYTE[]){1, 2, 3, 4});
Обратите внимание, что он размещен в стеке, поэтому может не подойти для ваших целей.
Ну, если BYTE - это класс, у вас мог бы быть конструктор
BYTE::BYTE(char c1,char c2){
//something here.
}
а потом позвони
Function( new BYTE(0X00,0X00))
Однако это может привести к утечке.Вы должны удалить аргумент перед выходом из функции.И это не всегда возможно (например, если у вас нет источника функции)
Вспомогательная функция;
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[]
;