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

循环格式化char数组元素时触发Segmentation Fault (core dumped)问题

问题分析与修复

核心段故障原因

代码触发段错误的直接原因是sprintf((char *)encrypted[i], "\\x%02X", message[i]);:

  • encrypted[i]是单个char值,强制转换为char*会把该字符的ASCII码当作内存地址,而这个地址几乎必然是非法内存区域,直接导致内存访问错误。

其他潜在问题

  • 符号扩展问题:char通常为有符号类型,当message[i]为负数时,%02X会输出符号扩展后的32位值(比如0xFF会变成0xFFFFFFFF),不符合预期的两位十六进制格式。
  • 冗余异或操作:连续四次异或k1到k4,等价于一次异或k1 ^ k2 ^ k3 ^ k4(异或运算满足交换律和结合律,两次异或相同值会抵消),原写法冗余低效。
  • 存储逻辑错误:每个\x%02X是4个字符(\、x、两位十六进制数),需要将这些字符连续存入encrypted数组,而非给每个encrypted[i]单独赋值。

修复后的代码

#include <iostream>
#include "stdint.h"
#include <cstring> 

uint32_t Key = 0xbeefbabe;

char message[128];
char encrypted[512]; // 扩容以容纳最长127字符的转换结果(127*4+1=509)

void offuscation () 
{   
    int len = strlen(message);
    // 合并异或密钥,简化操作
    uint8_t combined_key = (Key & 0xff) ^ ((Key >> 8) & 0xff) ^ ((Key >> 16) & 0xff) ^ ((Key >> 24) & 0xff);

    int offset = 0; // 跟踪encrypted的当前写入位置
    for( int i = 0; i < len; i ++ ) 
    {
        message[i] ^= combined_key;
        // 转换为uint8_t避免符号扩展,写入到encrypted的当前偏移位置
        offset += sprintf(encrypted + offset, "\\x%02X", static_cast<uint8_t>(message[i]));
    }
    // 确保字符串以终止符结尾
    encrypted[offset] = '\0';
}

int main () 
{
    strcpy(message, "Help me Please");
    offuscation();
    std::cout << encrypted << "\n";
    return 0;
}

关键修改说明

  • 修正sprintf目标地址:使用encrypted + offset作为写入起始地址,每次调用sprintf后更新offset,确保字符连续拼接。
  • 避免符号扩展:用static_cast<uint8_t>(message[i])将有符号char转换为无符号类型,保证%02X输出两位十六进制数。
  • 简化异或操作:合并四次异或为一次,提升代码效率。
  • 扩容数组并添加终止符:扩容encrypted以避免溢出,循环结束后手动添加'\0',确保字符串合法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:53:17