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

如何将SHA1哈希函数的返回值存储到数组及解决C6011空指针解引用警告

解决SHA1哈希结果存储的空指针问题

你的问题核心是空指针解引用,还有对哈希函数调用方式的误解,咱们一步步来解决:

首先,你声明的SHA1_Hash是一个uint8_t*类型的指针,但它默认是NULL(没有指向任何有效的内存区域),直接去访问SHA1_Hash[20]自然会触发C6011警告——你在操作一个空指针指向的内存,这是未定义行为,搞不好程序直接崩溃。

另外,你的代码里SHA1_Hash[20] = util_sha1_finalize(...)还有两个明显错误:

  • SHA1哈希是20字节,数组索引从0开始,SHA1_Hash[20]已经是第21个元素,属于越界访问;
  • 通常这类哈希函数是把结果写入你传入的缓冲区,而不是返回一个指针让你赋值给单个字节,类型也不匹配。

下面给你两种可行的解决方法:

方法1:使用栈上的静态数组(推荐,简单安全)

如果哈希结果不需要长期保存(比如只用在当前函数里),直接声明一个大小为20的uint8_t数组即可,栈内存会自动管理,不用手动释放:

uint8_t SHA1_Hash[20]; // 直接分配20字节的栈内存,刚好容纳SHA1哈希
util_sha1_finalize(&AuthContext, SHA1_Hash); // 让函数把结果写入这个数组

这种方式最省心,只要你确认util_sha1_finalize的第二个参数是用来接收哈希结果的缓冲区就行。

方法2:动态分配堆内存(适合需要长期保存结果的场景)

如果哈希结果要在当前函数外继续使用,就用malloc分配堆内存,记得用完后用free释放,避免内存泄漏:

uint8_t* SHA1_Hash = malloc(20 * sizeof(uint8_t));
if (SHA1_Hash != NULL) { // 一定要检查malloc是否成功,避免分配失败后继续操作
    util_sha1_finalize(&AuthContext, SHA1_Hash);
    // 这里可以使用SHA1_Hash指向的哈希结果...
    
    free(SHA1_Hash); // 用完记得释放内存!
} else {
    // 处理内存分配失败的情况,比如打印错误日志
}

额外提醒

建议你去查看util_sha1_finalize的函数文档或定义,确认它的参数和返回值:

  • 如果函数签名是类似void util_sha1_finalize(SHA1_Context* ctx, uint8_t* output),那上面两种方法都适用;
  • 如果函数返回一个指向内部静态缓冲区的指针(比如uint8_t* util_sha1_finalize(...)),那你不需要自己分配内存,但要注意这个静态缓冲区是否线程安全,以及是否需要把结果拷贝到自己的缓冲区里(因为下一次调用可能会覆盖这个静态缓冲区的内容)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:27:34