如何将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
相关产品推荐
相关产品推荐

