C++ memcpy返回不正确的结果
我制作的这个测试示例正如预期的那样工作:C++ memcpy返回不正确的结果,c++,audio,C++,Audio,我制作的这个测试示例正如预期的那样工作: FLAC__int32 array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; FLAC__int32 const *const handle(array); FLAC__int32 temp[10]; std::vector<FLAC__int32> base; base.resize(10); memcpy(&base[0], handle, 10 * sizeof(FLAC__int32));
FLAC__int32 array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
FLAC__int32 const *const handle(array);
FLAC__int32 temp[10];
std::vector<FLAC__int32> base;
base.resize(10);
memcpy(&base[0], handle, 10 * sizeof(FLAC__int32));
for (size_t i(0); i < 10; i++)
cout << endl << "[ " << i << " ] " << base[i];
下面是我如何调整向量大小和重置索引:
void
Source::metadata_callback (const ::FLAC__StreamMetadata *metadata)
{
...
total_samples_ = metadata->data.stream_info.total_samples;
...
data_.resize(total_samples_); index_ = 0;
} // main
您需要一个深度副本(也就是说,您想要复制FLAC\uuu int32
值,而不是指向这些值的指针),并且您似乎不关心是构建这些值的容器还是构建指向这些值的指针的容器。所以memcpy
是错误的工具。让我们从一个非常简单的案例开始:
void foo(int * buf)
{
int data = *buf;
}
然后尝试将数组复制到向量:
void foo(int * buf[])
{
vector<int> data(10);
for(unsigned int k=0; k<3; ++k)
data[k] = *buf[k];
}
void foo(int*buf[]
{
矢量数据(10);
对于(unsigned int k=0;k因为您要复制到数据[index.]
下面的循环不应该考虑到这一点而不是从索引0开始吗?@Retired Ninja下面的循环只是为了查看复制数据的前400个值。std::vector data.
在本例中的大小被调整为20750。我怀疑&\u buffer[0]
就是问题所在。\u buffer
是一个指针数组。不清楚这些指针是指连续的内存块,还是它们是不连续的。@greatwolf libFLAC的API没有说明,但只显示:您是在尝试进行浅拷贝(复制指针)还是深度拷贝(复制指针指向的对象)?
void foo(int * buf[])
{
vector<int> data(10);
for(unsigned int k=0; k<3; ++k)
data[k] = *buf[k];
}
FLAC__StreamDecoderWriteStatus Source::write_callback(FLAC__Frame const* _frame, FLAC__int32 const *const _buffer[])
{
cout << endl << "Head index [ " << index_ << " ].";
data_.resize(_frame->header.blocksize);
for(size_t k=0; k<_frame->header.blocksize; ++k)
{
data_[index_+k] = *_buffer[k];
}
index_ += _frame->header.blocksize;
cout << endl << "Tail index [ " << index_ << " ].";
for(size_t i(0); i < 400; i++)
{
cout << endl << "Buff [ " << i << " ] " << *_buffer[i];
cout << endl << "Data [ " << i << " ] " << data_[i];
}
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
}