0

这是一个类似于我定义的函数:

void Function( BYTE *data );

我想做的是这样的:

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

7 回答 7

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]);
于 2009-05-01T04:12:53.267 回答
5
BYTE foo[] = { 0x00, 0x00 };
Function( foo );

C++0x 将引入初始化列表语法,这将允许更接近您上面想要的东西。

于 2009-05-01T04:16:05.067 回答
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;
}

如果您想要的只是将BYTE数组初始化为全零,则上述方法有效。(我假设这是 WindowsBYTE类型。)但是,如前所述,这很容易泄漏,最好避免。

于 2009-05-01T05:10:47.370 回答
1

或者您可以使用省略号来模拟数组的构造:

看看这个:http ://www.cplusplus.com/reference/clibrary/cstdarg/va_arg/

如果你真的想在 0x 到达之前摆弄,看看这段代码

于 2009-05-01T09:48:47.497 回答
1

gcc 有一个名为“Compound literals”的扩展,它允许您编写:

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

Note that it is allocated on the stack, so it might not be suitable for your purposes.

于 2009-05-02T11:28:57.687 回答
0

好吧,如果 BYTE 是一个类,你可以有一个构造函数

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

然后打电话

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

但是,这很容易泄漏。您应该在退出函数之前删除参数。这并不总是可能的(例如,如果您没有 Function 的源代码)

于 2009-05-01T04:13:16.323 回答
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[]

于 2009-05-01T04:22:28.110 回答