在我的初始化中,我设置了以下内容:
- (id)init
{
if (self = [super init])
{
// Time-Domain Wavelet pitch detection setup
self.bufferCapacity = 2048;
self.index = 0;
dataBuffer = (SInt16*)malloc(self.bufferCapacity * sizeof(SInt16));
dywapBuffer = (double*)malloc(self.bufferCapacity * sizeof(double));
dywapitch_inittracking(&pitchtracker);
}
return self;
}
在回调中,我尝试执行以下操作:
SInt16 *dataBuffer = THIS->dataBuffer;
double *dywapBuffer = THIS->dywapBuffer;
for (int i = 0; i < THIS.bufferCapacity; i++)
{
double* doublePointer = dywapBuffer + (i * sizeof(double));
SInt16* intPointer = dataBuffer + (i * sizeof(SInt16));
*doublePointer = (double)(*intPointer);
}
double frequency = dywapitch_computepitch(&THIS->pitchtracker, dywapBuffer, 0, frames);
但是,当for循环达到i = 256时,应用程序在尝试分配doublePointer时会因EXC_BAD_ACCESS代码= 2而崩溃。任何人都知道我在这里做错了什么?我很难过。
答案 0 :(得分:1)
试试这个
SInt16 *dataBuffer = THIS->dataBuffer;
double *dywapBuffer = THIS->dywapBuffer;
for (int i = 0; i < THIS.bufferCapacity; i++)
{
// compiler will do the pointer arithmetic correctly for you
double* doublePointer = dywapBuffer + i;
SInt16* intPointer = dataBuffer + i;
*doublePointer = (double)(*intPointer);
}
double frequency = dywapitch_computepitch(&THIS->pitchtracker, dywapBuffer, 0, frames);
你不需要dywapBuffer + (i * sizeof(double))
这样的东西,因为它没有任何意义。编译器知道dywapBuffer
的类型为double *
,因此dywapBuffer + 1
会将地址增加sizeof(double)
。