C++ C++;空指针

C++ C++;空指针,c++,pointers,hdf5,C++,Pointers,Hdf5,我用HDF5库从C++中的HDF5文件中读取数据,我的问题是: status = H5Dread( hdf5_dataset, hdf5_datatype, hdf5_dataspace_in_memory, hdf5_dataspace_in_file, H5P_DEFAULT, buf ); 最后一个参数应该是一个空指针,我有一个要分配的浮点向量,但是当我试图传递向量时,g++会给我以下错误: 错误:无法将参数'6'的'std::vector

我用HDF5库从C++中的HDF5文件中读取数据,我的问题是:
status = H5Dread(
    hdf5_dataset,
    hdf5_datatype,
    hdf5_dataspace_in_memory,
    hdf5_dataspace_in_file,
    H5P_DEFAULT,
    buf
);
最后一个参数应该是一个空指针,我有一个要分配的浮点向量,但是当我试图传递向量时,g++会给我以下错误:

错误:无法将参数
'6'
'std::vector'
转换为
'void*'
'herr\t h5dreard(hid\t,hid\t,hid\t,hid\t,hid\u t,hid\u t,void*)


有没有任何方法可以直接写入向量而不必分配两次内存?

由于
std::vector
保证数据存储在连续内存中,您可以将向量转换为指针,如下所示:

std::vector<float> myFloats;
void *ptr = static_cast<void*>(&myFloats[0]); // or &myFloats.front()
std::vector myFloats;
void*ptr=static_cast(&myFloats[0]);//或&myFloats.front()
编辑:如果您在写入时没有调用
push_back
,请首先确保
调整大小
足够的空间

给定
std::vector
,您可以获得指向
float
s的连续缓冲区的指针,因此:

std::vector<float> v;
fillMyVectorSomehow(v);

float* buffer = &v[0]; // <---
std::vector v;
fillmyvector(v);

浮点*缓冲区=&v[0];//“…无需分配两次内存”-这是什么意思?我看你一次也没有分配任何内存。“两次”从何而来?@AndreyT:向量只分配一次内存。他试图避免分配一个新的块并在那里复制他的数据;他想重新使用现有的块,尽管现在没有一个
float*
,而是一个
void*
,来迭代它。@Tomalak Geret'kal:好吧,同样,为了在上面的上下文中正确地使用向量,必须做两件事:预先分配内部向量内存并将其正确地传递给函数。这就是为什么我也想看看内存是如何分配的。因为如果没有它,整件事就无法进行(即使你消除了上面的错误)。@AndreyT:如果他担心必须分配两次,那么很可能他已经分配了一次了。@Tomalak Geret'kal:不,很可能OP根本不关心分配,希望向量以某种方式自动完成所有事情。OP在接受答案后的第一条评论很好地表明OP对本例中的内存管理没有很好的了解。(答案的作者一开始也忽略了这个问题。我认为当前的代码示例有误导性。)谢谢,这正是我需要的。而且速度也很快!一旦我完成了,我就可以取消引用并删除指针了,对吗?不,内存属于
std::vector
,一旦它自己被销毁,它将处理删除操作(超出范围或是被删除,如果它是新的)@Node:注意,如果向量为空,这些选项中的任何一个都有未定义的行为。为了从C API中获得结果,您需要
调整大小
而不是
保留
@Billy good point,这是我的想法,只是不是我键入的:)-编辑。为什么要添加演员阵容?这完全没有必要。@比利:但我不会写一个明确的演员阵容<代码>无效*vp=缓冲区