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;
}
解决方案
您现在提出的功能实现与您对问题的原始描述有一个重要的不同。现在很清楚,所涉及的指针contentKeyCtx
是一个函数参数,而不是本地或文件范围的变量,并且代码显示它被用于将函数计算的指针传递回函数的调用者。
在这种情况下,函数调用的对应实际参数应该是适当类型变量的地址,函数将在其中存储生成的指针值,如下所示:
UInt8 *contentKeyCtx;
UInt32 contentKeyCtxSize = 0;
OSStatus status;
status = SKDServerGenCKC(..., &contentKeyCtx, &contentKeyCtxSize);
类似地适用于最后一个参数,如图所示;它显然用于返回返回的指针指向的空间的大小。
推荐阅读
- mongodb - 将数组转换为新字段,使用键作为该数组的值,使用值作为这些项目的频率(聚合框架)
- r - 使用 igraph 在具有较低和较高容量的网络中查找最大流量
- django - 创建序列化程序以处理模型关系
- xaml - 自定义 XAML 应用程序(非 WPF 和非 WWF)
- javascript - 在 ReactJs 中显示和隐藏循环元素
- python - 升级到 Python 3.8 后 wincom32.client.Dispatch 无法正常工作
- c - 当我在循环中调用函数时,将新节点插入单链表不起作用
- cordova - 科尔多瓦插件 nativegeocoder 未定义
- java - 运行后如何使用用户名、密码和 url 连接到 postgres docker 映像?
- airflow - 如何处理 Apache Airflow 中的条件决策点?