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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:30:45