无法拼接整数与字符串,代码无输出且单片机触发硬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
相关产品推荐
相关产品推荐

