将C#字节数组转换为C++

3

我非常感激这个社区以及它为我解决过去编程问题所提供的所有帮助。

现在不幸的是,我似乎找不到一个答案来解决这个看起来很简单的问题。请注意,我目前正在使用C++ 6.0。

这里是我试图从C#转换的代码:

byte[] Data = new byte[0x200000];
uint Length = (uint)Data.Length;

在C++中,我声明了一个新的字节数组Data,如下:

BYTE Data[0x200000];
DWORD Length = sizeof(Data) / sizeof(DWORD);

当我运行我的程序时,我收到堆栈溢出错误(很显然)。我认为这是因为数组太大了(如果我没记错的话是2MB)。
是否有办法在C++ 6.0中实现这个大小的数组?

1
在堆上声明数组是一个选项吗?我的意思是,你是否可以使用new关键字在堆上创建这个数组,而不是在栈上声明它? - Muhammad Hasan Khan
2个回答

3

如果这样定义数组,它会在堆栈上,导致堆栈溢出。您可以使用指针在堆上创建非常大的数组。例如:

BYTE *Data = new BYTE[0x200000];

2

目前,你正在线程的堆栈上分配大量内存,这将导致堆栈溢出,因为堆栈空间通常仅限于几兆字节。你可以使用 new 在堆上创建数组(顺便说一下,你正在错误地计算数组长度):

DWORD length = 0x200000;
BYTE* Data = new BYTE[length];

您最好使用vector<BYTE>而不是原始数组:

vector<BYTE> Data;
int length = Data.size();

当我尝试使用已声明的vector<BYTE>进行编译时,编译器会报错“vector是未声明的标识符”。我需要包含哪个头文件吗? - Brandon
@Brandon:#include <vector>using std::vector; - Mehrdad Afshari
1
#include <vector> - 如果你无法通过谷歌弄清楚这个,那么你根本没有尝试去帮助自己。而且不知道堆栈和STL的知识让我觉得你可以通过购买一本涵盖C++和STL基础的书籍来极大地帮助自己。还有一个没人提到的问题是,你还需要使用正确的delete[]语法删除该数组。 - Tod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接