簡體   English   中英

雙指針分配中的分段錯誤

[英]Segmentation Fault in double pointer assignment

我已經這樣聲明了雙指針

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;


}

您現在介紹的功能實現與問題的原始描述在重要方面有所不同。 現在很明顯,所涉及的指針contentKeyCtx是一個函數參數,而不是局部變量或文件范圍變量,並且代碼顯示該指針正用於將函數計算出的指針傳遞回函數調用者。

在這種情況下,函數調用的相應實際參數應為適當類型變量的地址,函數將在其中存儲生成的指針值,如下所示:

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

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

如圖所示,最后一個參數也是如此。 它顯然用於返回所返回指針所指向的空間的大小。

contentKeyCtx

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

我做錯了什么?

有兩種方法可以解決問題:

  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. 使用地址運算符(又名& ):

     contentKeyCtx = &localckc; 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM