Segmentation fault错误排查:如何正确调用sha256函数?
解决SHA256调用段错误的正确方式
问题根源
你的代码触发段错误有两个核心原因:
digest未分配有效内存:unsigned char *digest;是未初始化的野指针,sha256函数尝试向无效内存写入数据,直接导致段错误。SHA256哈希结果固定为32字节(256位),必须提前分配足够空间。- 错误的输出方式:哈希值是二进制字节序列,不是以
\0结尾的字符串,用printf("%s", digest)会读取到非预期内存,引发乱码或二次错误。
正确代码实现
方式1:使用静态数组(推荐,简单高效)
#include <stdio.h> // 你的sha256函数声明 void sha256(const unsigned char *message, unsigned int len, unsigned char *digest); int main() { const unsigned char *message = "fsd"; unsigned int len = 3; // SHA256哈希固定32字节,定义数组存储结果 unsigned char digest[32]; sha256(message, len, digest); // 将二进制哈希转换为十六进制字符串输出 for (int i = 0; i < 32; ++i) { printf("%02x", digest[i]); } printf("\n"); return 0; }
方式2:动态分配内存(适合需要灵活管理内存的场景)
#include <stdio.h> #include <stdlib.h> void sha256(const unsigned char *message, unsigned int len, unsigned char *digest); int main() { const unsigned char *message = "fsd"; unsigned int len = 3; // 动态分配32字节内存,需检查分配是否成功 unsigned char *digest = malloc(32); if (!digest) { fprintf(stderr, "内存分配失败\n"); return 1; } sha256(message, len, digest); // 输出十六进制哈希 for (int i = 0; i < 32; ++i) { printf("%02x", digest[i]); } printf("\n"); // 释放动态分配的内存 free(digest); return 0; }
关键注意事项
- 始终确保
digest指向至少32字节的有效内存,这是SHA256输出的固定长度。 - 输出哈希时必须将二进制字节转换为十六进制格式,避免直接当作字符串处理。
内容的提问来源于stack exchange,提问作者jiji
相关产品推荐
相关产品推荐

