双指针分配中的分段错误

时间:2018-12-07 14:33:39

标签: c

我已经这样声明了双指针

UInt8  **contentKeyCtx;

此变量作为参数发送给函数 函数内部有局部变量

 UInt8    *localckc     = NULL;
 localckc = calloc(1, localckcSize);

然后有一些值分配给localckc

当我尝试这样做

 *contentKeyCtx = localckc;

我遇到了细分错误

我做错了什么? 主要功能

int main (int argc, char *argv[])
{
    OSStatus result; // SInt32


    UInt8  *inBuff, *outBuff;
    UInt32 inBuffSize, outBuffSize;
    UInt8  **contentKeyCtx = calloc(1, sizeof(UInt8**));
    UInt32  *contentKeyCtxSize;
    FILE   *fp;


    const UInt8 *assetId = {0x1b, 0xf7, 0xf5, 0x3f, 0x5d, 0x5d, 0x5a, 0x1f};// what is this?



    inBuff=calloc(1,INBUFFSIZE);
    outBuff=calloc(1,OUTBUFFSIZE);


    inBuffSize = fread(inBuff, sizeof(UInt8), INBUFFSIZE, fp);

    fclose(fp);


    // IK we have some data. Now what?
    result = SKDServerGenCKC(inBuff, inBuffSize, assetId, contentKeyCtx, contentKeyCtxSize);


    free(inBuff);
    free(outBuff);
    printf("Result is  %d\n", result );
    return 0;
}

实际功能实现

    OSStatus SKDServerGenCKC(
        const UInt8   *serverPlaybackCtx,
        UInt32         serverPlaybackCtxSize,
        const UInt8   *assetId,
        UInt8        **contentKeyCtx,
        UInt32        *contentKeyCtxSize)
{

    UInt8    *localckc     = NULL;
    UInt32    localckcSize = 0;
    PS_RequireAction(ckcContainer      != NULL, return kDRMSKDServerParamErr;)
    PS_RequireAction(contentKeyCtx     != NULL, return kDRMSKDServerParamErr;)
    PS_RequireAction(contentKeyCtxSize != NULL, return kDRMSKDServerParamErr;) 
    ...
     localckc = calloc(1, localckcSize);
     status = SKDServerWriteBytes(
                &ckcContainer->parser.currentOffset, PS_AES128_IV_SZ, 
                ckcContainer->aesKeyIV, localckcSize, localckc);


    ...
    *contentKeyCtx = localckc;


}

3 个答案:

答案 0 :(得分:5)

您现在提供的功能实现与问题的原始描述有很大的不同。现在很明显,所涉及的指针contentKeyCtx是一个函数参数,而不是局部变量或文件作用域变量,并且代码显示该指针正用于将函数计算出的指针传递回函数的来电者。

在这种情况下,函数调用的相应实际参数应为适当类型变量的地址,函数将在其中存储生成的指针值,如下所示:

UInt8        *contentKeyCtx;
UInt32       contentKeyCtxSize = 0;
OSStatus     status;

status = SKDServerGenCKC(..., &contentKeyCtx, &contentKeyCtxSize);

类似地适用于最后一个参数,如图所示;显然,它用于返回返回的指针所指向的空间的大小。

答案 1 :(得分:1)

contentKeyCtx

未初始化,它什么也没有指向。

答案 2 :(得分:1)

  

我做错了什么?

有两种方法可以解决问题:

  1. 初始化contentKeyCtx

    // Use 'calloc()', if you want it to be zero by default...
    UInt8  **contentKeyCtx = malloc(1, sizeof(Uint8*));
    // Do something with it...
    

    或:重新分配它:

    UInt8  **contentKeyCtx;
    contentKeyCtx = realloc(NULL, sizeof(Uint8*));
    // Do something with it...
    
  2. 使用address-of运算符(也称为&):

    contentKeyCtx = &localckc;