[英]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
沒有初始化,它什么也沒有指向。
我做錯了什么?
有兩種方法可以解決問題:
初始化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...
使用地址運算符(又名&
):
contentKeyCtx = &localckc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.