Objective-C:当单步执行double *数组时,EXC_BAD_ACCESS代码= 2

时间:2014-05-20 03:05:14

标签: ios objective-c exc-bad-access

在我的初始化中,我设置了以下内容:

- (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而崩溃。任何人都知道我在这里做错了什么?我很难过。

1 个答案:

答案 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)