Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在堆上从二进制数组转换为多维数组_C++_C_Multidimensional Array_Heap_Binaryfiles - Fatal编程技术网

C++ 在堆上从二进制数组转换为多维数组

C++ 在堆上从二进制数组转换为多维数组,c++,c,multidimensional-array,heap,binaryfiles,C++,C,Multidimensional Array,Heap,Binaryfiles,我目前正在使用二进制文件快速访问存储在多维数组中的自定义对象,这些对象作为对象数组保存到文件中。到目前为止,从文件读取并没有太大问题,因为我一直在将数组读取到堆栈上相同的对象数组中。它看起来像这样: Foo foo[5][10]; ifstream infile("foofile.dat",ios::in|ios::binary); infile.read((char*)&foo, sizeof Foo); 我目前遇到的问题是,我存储的数据越来越多,在创建本地对象数组时,堆栈溢出。然后

我目前正在使用二进制文件快速访问存储在多维数组中的自定义对象,这些对象作为对象数组保存到文件中。到目前为止,从文件读取并没有太大问题,因为我一直在将数组读取到堆栈上相同的对象数组中。它看起来像这样:

Foo foo[5][10];
ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)&foo, sizeof Foo);
我目前遇到的问题是,我存储的数据越来越多,在创建本地对象数组时,堆栈溢出。然后,解决方案似乎是在堆上创建本地对象数组,我不确定如何格式化它,以便可以直接从char*转换它。下面是我将如何在堆上进行分配:

Foo (*foo)[1000] = new Foo [500][1000];
但是,如果我想对整个数组进行强制转换,这似乎不是正确的格式。例如,如果我尝试执行以下操作,则无效:

ifstream infile("foofile.dat",ios::in|ios::binary);
infile.read((char*)(*foo), (sizeof Foo * 500 * 1000));  //or below
infile.read((char*)(&foo), (sizeof Foo * 500 * 1000));  //or below
infile.read((char*)(foo), (sizeof Foo * 500 * 1000));   //or below
本质上,我不知道如何使用我在堆上分配的数组来构造它。有人能给点建议吗

非常感谢,
jim

我认为您使用的解决方案在一般情况下不起作用;现代操作系统使用堆随机化,因此在一个程序的多个运行中并不总是能够声明相同的虚拟地址空间

如果存储的任何对象包含指针,则当加载到不同的虚拟拓扑中时,指针将悬空


您是否尝试过将对象序列化为正确的磁盘格式,而不是仅仅编写二进制blob?

我已经很久没有编写非托管代码了,现在甚至记不起语法了。有一种方法可以分配一个连续的内存块,并能够转换为多维数组。如果您一次性分配了所有需要的资源,那么就让每个元素指向该块中的相关位置。(对语法/代码错误表示歉意)

void*ptr=malloc(void*)(sizeof(Foo)*500*1000);
Foo**Foo=(Foo**)ptr;

对于(int i=0;i ),在这里我认为使用C++机制分配/解除是没有多大意义的,因为您完全通过读取覆盖数据。所以不要做<代码>新< /COD> >代码>删除< /COD>东西。您的CAST <代码>(char)
实际上是一个
重新解释\u cast
。为什么不使用大小正确的
malloc

typedef Foo largeFoo[500][1000];
largeFoo* data = reinterpret_cast< largeFoo* >(malloc(sizeof largeFoo));

因此,所有剩余的代码都可以与堆栈版本中的代码保持一致,只在末尾有一个
空闲的

我存储的对象中没有一个包含指针。它们只是多维数组中简单的基于值的结构。也就是说,该对象是一个包含一些int和float的结构,位于一个2d数组中。尽管如此,仍在更改endianness会破坏INT…我只是不喜欢二进制转储。要创建堆数组,如果必须的话-您上面的新调用应该与您给出的第三个读取行(将foo转换为char*)一起工作。我看不出有什么问题。另外,请注意对齐;如果在错误对齐的地址加载,则整数将不起作用。哈,你知道吗,第三个版本确实起作用!我只尝试通过visual studio调试器检查值,但它没有正确显示数组中的堆值。将其中一个值分配给本地变量e确认数据在那里。非常感谢!对,是的,我有一个不变的标准格式。所以我能够管理Endianness对齐问题,没有太多问题,但重点是。再次感谢。
typedef Foo largeFoo[500][1000];
largeFoo* data = reinterpret_cast< largeFoo* >(malloc(sizeof largeFoo));
largeFoo& foo = *data;