我正在编写一个C++程序。我解析一个文件并初始化一个结构。我有一个数组来初始化,但我必须从文件中读取数组的大小。我想在一个函数中读取数组长度并进行数组初始化。如果我将数组指针传递给另一个函数并执行一个新的函数,则当该函数返回时,指针将被销毁,并且我看不到初始化的值。这是预期还是我错过了一些东西。我怎样才能克服这个问题?传递参数的C++内存初始化
回答
通过忘记关于手动数组,原始指针传递*和new
的所有信息,可以克服这一点。这是C++,不1991.所以,一个典型的解决方案可以是这样的:
#include <vector>
#include <cstdint>
#include <istream>
std::vector<uint32_t> read_data(std::istream & is)
{
uint32_t len;
is.read(reinterpret_cast<char*>(&len), sizeof(uint32_t));
std::vector<uint32_t> result(len);
for (uint32_t i = 0; i != len; ++i)
{
is.read(reinterpret_cast<char*>(&result[i]), sizeof(uint32_t));
}
return result;
}
(在高质量的代码,所述read
命令将通过条件和错误包围将通过抛出异常来处理,可能。)
随后:
#include "int_reader.hpp"
#include <fstream>
#include <iostream>
int main()
{
std::ifstream infile("thedata.bin", std::ios::binary);
std::vector<uint32_t> data = read_data(infile);
std::cout << "We read " << data.size() << " integers.\n";
}
*),其具有在一般用途下的地方的唯一原始指针++是char*
用于I/O操作时,通过将该代码作为证明。 C++将char
定义为机器的基本数据单元类型,并且I/O以char
为单位发生。
好吧,我同意你的看法,但我对C++非常陌生,现在已经在C和嵌入式系统工作了8年,我需要一些时间来克服自己写所有东西的习惯:) – Saba
@Saba:You如果你想在C++中雄辩地想要忘记几乎所有关于C的事情:-) –
在调用new
之前没有数组指针。所以你不可能把它传递给一个函数。
可能你正在做的是将数组指针的未初始化的垃圾值传递给一个函数。该函数使用从new
返回的正确指针覆盖其垃圾值的副本,但是原始函数从未看到该指针。
您需要将函数传递给指针。然后当它调用new
时,它可以使用指针指针来更新调用者的指针。就像这样:
void SomeFunction(void **SomePointer)
{
(*SomePointer) = malloc(1024);
}
void *MyPointer;
SomeFunction(&MyPointer);
而且我同意Kerrek,这是C做事的方式。 C++的方式更好。 –
除非你不能解除引用'void *'或者你错过了'void **'的明星吗? – Pablo
我在发布后大约两秒钟就修复了它。还有另一个不写这样的代码的原因。 ;) –
你有一个指针传递给一个指针,以便有一个功能,将它分配给你
void allocateArrayOfT(T** objArray, size_t len) {
*objArray = new T[len];
}
您可以拨打:
T* arrayPtr;
allocateArrayOfT(&arrayPtr, len);
- 1. 参数传递到初始化函数
- 2. 初始化时传递参数UICollectionViewCell
- 3. 初始化表时传递参数
- 4. 传递参数来初始化Singleton
- 5. 初始化对象内嵌并作为参数传递 - java
- 6. 在smalltalk中新建并初始化 - 如何传递参数来初始化
- 7. 无法通过JavaScript中的初始化函数传递参数
- 8. Java的赋值函数:初始化与传递到参数
- 9. 传递一个未初始化的数组的函数用C
- 10. 问题与传递展开参考目标C初始化
- 11. 将未初始化的二维数组作为参数传递给C
- 12. 传递构造函数参数以初始化对象
- 13. 传递参数使用addDomListener初始化函数
- 14. 对象的初始化工作作为参数传递
- 15. 如何将初始化的HashMap作为参数传递?
- 16. 指定的初始化和传递参数
- 17. 初始化并传递一个数组
- 18. 验证内存已初始化在C
- 19. C#类初始化不同的参数?
- 20. 初始化,初始化与参数和便利初始化
- 21. 数组初始化函数:传递数组作为指针:C++
- 22. 初始化参考C++
- 23. C++参考初始化
- 24. C - 将未初始化的变量传递给函数
- 25. 初始化ThreadLocal变量时传递参数
- 26. 如何将参数传递给静态初始化块
- 27. 在类初始化期间传递参数
- 28. 使用初始化方法将参数传递给控制器
- 29. 初始化UIViewController时如何传递一个参数?
- 30. 在Codeigniter中初始化库时传递参数
你应该表现出你的代码来获得一些答案 –
实际上除了缺少代码来证明你的问题之外,特别是中间部分很难理解。你做一个运营商的“新”电话,然后呢? – 0xC0000022L
@STATUS_ACCESS_DENIED:他得到访问被拒绝异常! – 2011-11-22 19:01:40