1. 问题描述
使用sscanf函数将字符串对变量赋值的时候,会把当前变量地址后面的变量内容修改掉。
1. 变量定义
uint8_t TargetType = 0x00; //0x00 WallE; 0x01 Elin
uint8_t val = 0; //string length
uint8_t SLAVE_ADDR = 0x4C;
uint8_t TxData[12] = { 0x00};
uint8_t buffer[4096] = {0x00};
uint8_t mem_data[8];
uint8_t str[13];
uint8_t *TxBackData = (void *)0;
int i=0;
uint8_t Buf[11] = "slave 0x4C";
2. 变量修改
TxBackData = &buffer[0]; //指针指向数组
sscanf((const char *)(Buf+5), "%x", (char *)&SLAVE_ADDR); //将0x4C赋值给变量SLAVE_ADDR ,结果发现TxBackData 指针被修改了
2. 原因
待查…
3. 问题复现
下面是vscode上运行的代码,由于和单片机的内存管理不一样,所以用value变量来替代指针,但同样出现value值被修改的现象。
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
uint8_t TargetType = 0x00; //0x00 WallE; 0x01 Elin
uint8_t val = 0; //string length
uint8_t SLAVE_ADDR = 0x4C;
uint8_t value = 2;
uint8_t *TxBackData = (void *)0;
uint8_t TxData[12] = { 0x00};
uint8_t buffer[4096] = {0x00};
uint8_t mem_data[8];
uint8_t str[13];
int i=0;
uint8_t Buf[11] = "slave 0x4C";
int main()
{
TxBackData = &buffer[0]; //指针指向数组
printf("SLAVE_ADD addr = %p,value addr = %p, RTxBackData addr = %p\r\n",&SLAVE_ADDR, &value, &TxBackData);
buffer[0] = 'C';
sscanf((const char *)(Buf+5), "%x", (char *)&SLAVE_ADDR); //将0x4C赋值给变量SLAVE_ADDR ,结果发现TxBackData 指针被修改了
printf("slave 0x%x,val = %d, TxBackData[0] = %c\n", SLAVE_ADDR,value, TxBackData[0]);
return 0;
}
代码运行结果:
SLAVE_ADD addr = 00007ff6fff0f000,value addr = 00007ff6fff0f001, RTxBackData addr = 00007ff6fff13048
slave 0x4c,val = 0, TxBackData[0] = C
问题复现2
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
uint8_t TargetType = 0x00; //0x00 WallE; 0x01 Elin
uint8_t val = 0; //string length
uint8_t SLAVE_ADDR = 0x4C;
uint8_t value1 = 0x5a;
uint8_t value2 = 0x5a;
uint8_t value3 = 0x5a;
uint8_t value4 = 0x5a;
uint8_t value5 = 0x5a;
uint8_t *TxBackData = (void *)0;
uint8_t TxData[12] = { 0x00};
uint8_t buffer[4096] = {0x00};
uint8_t mem_data[8];
uint8_t str[13];
int i=0;
uint8_t Buf[11] = "slave 0x28";
int main()
{
TxBackData = &buffer[0]; //指针指向数组
printf("SLAVE = 0x%x,value1 = 0x%x,value2 = 0x%x,value3 = 0x%x,value4 = 0x%x,value5 = 0x%x\r\n",SLAVE_ADDR, value1, value2, value3, value4, value5);
printf("SLAVE addr = %p \r\n value1 addr = %p \r\n value2 addr = %p \r\n value3 addr = %p \r\n value4 addr = %p \r\n value5 addr = %p\r\n",&SLAVE_ADDR, &value1, &value2, &value3, &value4, &value5);
buffer[0] = 'C';
sscanf((const char *)(Buf+6), "%x", (char *)&SLAVE_ADDR); //将0x4C赋值给变量SLAVE_ADDR ,结果发现TxBackData 指针被修改了
printf("SLAVE = 0x%x,value1 = 0x%x, value2 = 0x%x, value3 = 0x%x, value4 = 0x%x, value5 = 0x%x\r\n",SLAVE_ADDR, value1, value2, value3, value4, value5);
return 0;
}
结果:
SLAVE = 0x4c,value1 = 0x5a,value2 = 0x5a,value3 = 0x5a,value4 = 0x5a,value5 = 0x5a
SLAVE addr = 00007ff701bdf000
value1 addr = 00007ff701bdf001
value2 addr = 00007ff701bdf002
value3 addr = 00007ff701bdf003
value4 addr = 00007ff701bdf004
value5 addr = 00007ff701bdf005
SLAVE = 0x28,value1 = 0x0, value2 = 0x0, value3 = 0x0, value4 = 0x5a, value5 = 0x5a