为什么我在C ++中有一个空指针取消引用?

时间:2018-04-18 07:41:33

标签: android c++ eclipse null

我在Eclipse中得到一个空指针取消引用,我不知道如何正确修复这个错误。

以下是日志错误:

04-18 10:27:48.538: A/DEBUG(22481): Build fingerprint: 
'OnePlus/OnePlus3/OnePlus3T:8.0.0/OPR6.170623.013/12041042:user/release- keys'
04-18 10:27:48.538: A/DEBUG(22481): Revision: '0'
04-18 10:27:48.538: A/DEBUG(22481): ABI: 'arm'
04-18 10:27:48.538: A/DEBUG(22481): pid: 22024, tid: 22078, name: GLThread     8317  >>>  <<<
04-18 10:27:48.538: A/DEBUG(22481): signal 11 (SIGSEGV), code 1     (SEGV_MAPERR), fault addr 0x0
04-18 10:27:48.538: A/DEBUG(22481): Cause: null pointer dereference
04-18 10:27:48.538: A/DEBUG(22481):     r0 b9bb0e74  r1 00000000  r2     00000001  r3 00000000
04-18 10:27:48.538: A/DEBUG(22481):     r4 000aa185  r5 afdd0c28  r6     b9bb1a40  r7 b9b83a40
04-18 10:27:48.538: A/DEBUG(22481):     r8 0000cf00  r9 000ac440  sl     00000000  fp 0000ac44
04-18 10:27:48.538: A/DEBUG(22481):     ip 000bdcc0  sp c1bfe1b0  lr     c25fd079  pc c25fd084  cpsr 08070030
04-18 10:27:48.541: A/DEBUG(22481): backtrace:
04-18 10:27:48.541: A/DEBUG(22481):     #00 pc 0022d084      /data/app/com.-xBYgyq_62u2R3qWK0qBgkQ==/lib/arm/libgame.so     (_ZN12CSoundSource12GetAudioDataEPfii+87)

错误发生在代码的这一部分:

void CSoundSource::GetAudioData(float *data, int frameStart, int frames)
{
int i=0;
while(i<frames)
    {
    int temp_samp = (frameStart+i) % TotalSamples;
    int tmp_div = temp_samp / blockSize;
    int tmp_mod = temp_samp % blockSize;
        *data = block[tmp_div]->buffer[tmp_mod][0] * 0.00003f;
    data++;
        *data = block[tmp_div]->buffer[tmp_mod][1] * 0.00003f;
    data++;
    i++;
    }
}

有人能告诉我如何解决空解除引用问题吗?或者暗示我指出正确的方向?

谢谢。

1 个答案:

答案 0 :(得分:2)

我发现了问题。

显然崩溃的原因是block[tmp_div]为NULL。另一个线程没有在*data = block[tmp_div]->buffer[tmp_mod][0] * 0.00003f;之前为它分配值,所以我必须检查每个block[]以查看它是否为NULL,如果是,则尝试再次给它正确的值。

因此,我发布的代码部分如下所示:

void CSoundSource::GetAudioData(float *data, int frameStart, int frames)
{
    int i=0;
    while(i<frames)
    {
        int temp_samp = (frameStart+i) % TotalSamples;
        int tmp_div = temp_samp / blockSize;
        int tmp_mod = temp_samp % blockSize;
        if(block[tmp_div])
            *data = block[tmp_div]->buffer[tmp_mod][0] * 0.00003f;
        data++;
        if(block[tmp_div])
            *data = block[tmp_div]->buffer[tmp_mod][1] * 0.00003f;
        data++;
        i++;
    }
}