You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:typedef结构体缓冲区指针初始化出现不兼容指针类型错误求助

问题分析与解决

错误原因

你的代码存在两个核心问题:

  • 指针初始化方式错误:otCryptoKey *aKey是指向结构体的指针变量,不能直接用结构体成员值的初始化列表{mKeyPointer}给指针赋值——指针需要指向一个实际存在的结构体实例,而非直接用成员值初始化。
  • 指针类型不兼容:结构体的mKey字段是const uint8_t *类型,而你定义的mKeyPointer是uint8_t *类型,直接赋值会触发incompatible-pointer-types错误。

另外补充一个潜在问题:你用字符串初始化uint8_t mKey[16]时,字符串"1234567891012131"包含16个可见字符,加上C字符串默认的末尾\0,会超出数组的16字节容量,导致缓冲区溢出,建议调整数组大小为17,或者使用无终止符的字节数组初始化方式。

正确写法

方式1:直接初始化结构体变量(推荐,栈分配)

// 调整数组大小避免溢出,或者用字节初始化
uint8_t mKey[17] = "1234567891012131";
// 初始化结构体变量,而非指针
otCryptoKey aKey = {
    .mKey = mKey, // 数组名自动转为const uint8_t*,也可以显式转换:(const uint8_t*)mKey
    .mKeyLength = sizeof(mKey) - 1, // 减去末尾的\0,或者直接写16
    .mKeyRef = 0 // mKey非NULL时,该字段无意义,设为0即可
};
// 如果需要指针,取结构体变量的地址
otCryptoKey *aKeyPtr = &aKey;

方式2:动态分配结构体(堆分配)

如果需要在堆上创建结构体,可使用malloc分配内存后赋值:

uint8_t mKey[17] = "1234567891012131";
otCryptoKey *aKey = malloc(sizeof(otCryptoKey));
if (aKey != NULL) {
    aKey->mKey = (const uint8_t*)mKey;
    aKey->mKeyLength = sizeof(mKey) - 1;
    aKey->mKeyRef = 0;
}
// 使用完毕后记得释放内存
// free(aKey);

内容的提问来源于stack exchange,提问作者Jenath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 21:25:39