double* samples;
samples[0] = aValue;
这真的很糟糕。:( 请不要这样做!“sample”只是指向您内存中某个位置的指针。它指向的内存根本没有分配,但是您正在写入该内存...
您可以从堆或堆栈中分配一块内存。但是,堆栈有大小限制(在您的编译器设置中配置) - 因此对于较大的块(如音频数据),您通常会从堆中分配它。但是你必须小心,你不会从堆中泄漏内存 - 堆栈内存是由你的变量范围自动管理的,所以这更容易开始。在 C/C++ 中,您可以像这样从堆栈中分配内存:
double samples[512];
然后您可以执行以下操作:
samples[0] = aValue; // change value of 1st sample in sample buffer with 512 elements
或者
double* pointerToSample = samples[255]; // point to 256ths sample in the sample buffer
pointerToSample[127] = aValue; // change value of 384ths sample (256+128) in our sample buffer with 512 elements
等等......但如果你只是这样做,
double* pointerToSample;
pointerToSample[127] = aValue;
您正在实际写入未分配的内存!您的指针指向某个地方,但它后面没有分配的内存。小心这个!如果 samples 变量已经超出范围,也永远不要访问 pointerToSample:否则将不再分配指向的内存 pointerToSample。
要在 C++ 中从堆中分配内存,有关键字 new(分配内存)和 delete(之后释放内存)动态。
IE
double *samples = new double[512];
将为您的示例数据分配一块内存。但是在使用它之后,你必须手动删除它——否则你会泄漏内存。所以就这样做:
delete[] samples;
在你完成之后。
最后但并非最不重要的一点是回答您的问题如何创建二维数组来调用方法 ProcessDoubleReplacing()
int main(int argc, char ** argv){
/* create 2 dimensional array */
int** samplesIn = new int*[44100];
int** samplesOut = new int*[44100];
for(int i = 0; i < 44100; ++i){ // 1s @ 44.1Khz
samplesIn[i] = new int[2]; // stereo
samplesOut[i] = new int[2]; // stereo
}
/* TODO: fill your input buffer with audio samples from somewhere i.e. file */
ProcessDoubleReplacing(samplesIn, samplesOut, 44100);
/* cleanup */
for(int i = 0; i < 44100; ++i) {
delete [] samplesIn[i];
delete [] samplesOut[i];
}
delete [] samplesIn;
delete [] samplesOut;
return 0;
}