Keil IDE 自动改变我的字符数组orrignal值
Keil IDE automatically changing my char array orrignal value
我正在将 uint8_t 数组转换为 char 数组,然后使用 gsm 模块传输它,但是在将 uint8_t 转换为 char 时出现问题,它的值发生变化(例如,十六进制值 0455 有时变为 0400 00 )
我也试过将keil优化level3改成level2,但遇到同样的问题
这是我的代码
uint8_t b_id[2]={11, 12};
char bike_id[2]={0};
...
...
{
...
...
//send id data
for(i=0; i<2; i++)
{
sprintf(bike_id, "%02x", b_id[i]);
sim808_send_tcp_tx(bike_id, 2);
}
}
问题出在这两行:
char bike_id[2]={0};
...
sprintf(bike_id, "%02x", b_id[i]);
你忘记了 C 中的字符串实际上叫做 null-terminated byte strings。 null-terminated 部分很重要,这意味着两个字符的字符串实际上需要 three 个字符:字符串的两个字符,加上终结者。
在你的情况下,因为你在数组 bike_id
中只有两个字符,所以 sprintf
调用将写终止符越界,导致 未定义的行为.
简单的解决方案?使bike_id
三个个字符长。
我正在将 uint8_t 数组转换为 char 数组,然后使用 gsm 模块传输它,但是在将 uint8_t 转换为 char 时出现问题,它的值发生变化(例如,十六进制值 0455 有时变为 0400 00 )
我也试过将keil优化level3改成level2,但遇到同样的问题
这是我的代码
uint8_t b_id[2]={11, 12};
char bike_id[2]={0};
...
...
{
...
...
//send id data
for(i=0; i<2; i++)
{
sprintf(bike_id, "%02x", b_id[i]);
sim808_send_tcp_tx(bike_id, 2);
}
}
问题出在这两行:
char bike_id[2]={0};
...
sprintf(bike_id, "%02x", b_id[i]);
你忘记了 C 中的字符串实际上叫做 null-terminated byte strings。 null-terminated 部分很重要,这意味着两个字符的字符串实际上需要 three 个字符:字符串的两个字符,加上终结者。
在你的情况下,因为你在数组 bike_id
中只有两个字符,所以 sprintf
调用将写终止符越界,导致 未定义的行为.
简单的解决方案?使bike_id
三个个字符长。