C语言 为什么我的函数会根据调用的位置返回不同的值?[关闭]

jjhzyzn0  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(112)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

15小时前关门了。
Improve this question
我必须以这种方式编写一个字符串:

char message[200];
uint32_t device_id = get_raw_device_id(); // returns an internal FICR register value
char some_string[50];

/* Some intermediary code to populate some_string and open an MQTT connection. */

int len = snprintf(message, sizeof(message), 
        "{\"device_id\": \"%08X\", \"Params\": \"%s\"}",
        device_id, some_string);

当打印“消息”时,我总是得到:{“device_id”:“6501000A”,“Params”:“XXXXXXX”}。
下面是get_raw_device_id()的代码:

#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */

typedef struct { 
....
  __IM  uint32_t  DEVICEID[2]; /*!< (@ 0x00000060) Description collection: Device identifier  */
....
} NRF_FICR_Type;

uint32_t get_raw_device_id()
{
    return NRF_FICR->DEVICEID[1]; // Only getting one of the 32bit values for brevity
}

device_id应该是十六进制值0x 6501 C74 F。当我这样安排代码时,这是固定的:

char message[200];
char some_string[50];

/* Some intermediary code to populate some_string and open an MQTT connection. */

int len = snprintf(message, sizeof(message), 
        "{\"device_id\": \"%08X\", \"Params\": \"%s\"}",
        get_raw_device_id(), some_string);

将函数调用移动到字符串组合行可以解决这个问题,但我不确定为什么会发生这种情况。

b91juud3

b91juud31#

device_id的值已从0x6501C74F更改为0x6501000A,这与其前2个字节已被0x0A0x00覆盖一致。这可能来自缓冲区溢出,其中存储到some_string中的字符串将超过数组的长度,并且尾随的换行符'\n'和null终止符覆盖了device_id的初始部分(如@the_busybee所评论的)。
您应该研究代码中被省略的部分(总结为/* Some intermediary code to populate some_string and open an MQTT connection. */),以了解可能的缓冲区溢出。张贴此代码应该会得到更准确的答案。

相关问题