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

无法拼接整数与字符串,代码无输出且单片机触发硬fault问题排查

问题分析与解决

你的代码里有三个关键问题,直接导致了无输出和hard fault:

  • 字符串常量无法被修改:char* header = "ABC";定义的是只读字符串常量,它被存在单片机的Flash(只读存储区)里。strcat会尝试往这个字符串末尾追加内容,属于写入只读内存的非法操作,这是触发hard fault的核心原因。

  • 野指针导致内存越界:char* data_length_str;是未初始化的野指针,指向的是随机内存地址。sprintf往这个地址写数据时,会破坏程序的栈或其他关键数据,直接引发崩溃,自然不会有输出。

  • 缓冲区空间不足:就算header是可修改的,原来的"ABC"只占4个字节(包含结束符\0),要拼接"10"需要至少6个字节的空间才能放下"ABC10\0",空间不够也会导致内存溢出。

下面是修正后的代码:

#include "stdio.h"
#include "string.h"
#include "stdint.h"

// 定义足够大的可修改缓冲区,预留足够空间给拼接后的内容
char header[10] = "ABC";
uint8_t data_length = 10;
// 定义固定大小的缓冲区存储整数转换后的字符串(最多支持3位十进制数)
char data_length_str[4];
uint8_t command = 0xA0;

int main()
{
    // 用snprintf更安全,避免缓冲区溢出
    snprintf(data_length_str, sizeof(data_length_str), "%d", data_length);
    // 往可修改的header缓冲区拼接字符串
    strcat(header, data_length_str);
    printf("Header = %s", header);

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:52:13