关于 c:sprintf 导致我的程序在 keil 中停止工作

sprintf cause my program stop working in keil

这是我的主要功能,我不知道为什么当我在 proteos 中模拟它时,我发现代码运行到 sprintf 并且下一行没有运行,当我评论它时"salam"印刷在液晶显示器上
我使用 mingw 编译器并且我已经安装了所有库
诠释主要(无效)
{
/* 用户代码开始 1 */

/* 用户代码结束 1 */

/* MCU 配置------------------------------------------- -------------*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
char q[5] ="salam" ;
int a = 6541;
//float b = a/7;
LCD1602_Begin8BIT(RS_GPIO_Port,RS_Pin,E_Pin,D0_GPIO_Port,D0_Pin,D1_Pin,D2_Pin,D3_Pin,D4_GPIO_Port,D4_
Pin,D5_Pin,D6_Pin,D7_Pin);
LCD1602_setCursor(1,1);

//snprintf(q, 20,"%10d", 1234567);
//LCDCHAR_Puts(0, 0, q);    
//char command1[50], command2[50]; // Added
//char *temp[] = {NULL, command1, command2, NULL}; // Modified
//temp[0]="sum";
   
LCD1602_print("mahdi kahrizi");
   
   
LCD1602_2ndLine();
sprintf(q,"%d",a);
LCD1602_print(q);


问题从这里开始。

1
char q[5] ="salam" ;

q 太短,无法存储该单词。它必须至少有 6 个字符长。

当您在数组边界之外写入时,这是未定义的行为。

当你将 q 的长度改为更长时

1
snprintf(q, sizeof(q),"%d", a);