我怎样才能使第二个代码工作? (C 代码、sprintf 和指针)

How can I make the second code works? (C code, sprintf and pointers)

我正在使用 stm32f429 UART 向模块发送命令。我更喜欢第二个功能代码,但我不知道如何让它工作。 第一个功能代码,完整运行。

void v_cmd(unsigned short cmd)
{
    uint8_t cmd_packet[8];
    sprintf((char *)cmd_packet, "%02hu", cmd);
    HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}

Seconde 函数代码,它不像我预期的那样作为第一个代码工作。

void v_cmd(unsigned short cmd)
{
    uint8_t *cmd_packet;
    sprintf((char *)cmd_packet, "%02hu", cmd);
    HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);
}

它在第一段代码中起作用,因为您正在为 with

分配内存
uint8_t cmd_packet[8];

您必须知道,这是分配 8 个字节的内存。

在您分享的第二段代码中,uint8_t *cmd_packet;是一个指针。但是,您还没有在该点指向的位置分配任何内存。 当前状态下的代码不起作用,因为指针 cmd_packet 未初始化。

下一条语句,

sprintf((char *)cmd_packet, "%02hu", cmd); 

尝试用数据 cmd 填充 cmd_packet 指向的内存。但是,就像我之前解释的那样,它没有指向可以放置此数据的有效地址位置。这最终导致分段错误。

使用malloc分配内存。您可以参考 malloc.

的手册页
uint8_t *p_cmd_packet = malloc(8);

您的代码接下来应该做的是检查对 malloc 的调用是否已成功分配内存,如果未分配内存则进行一些错误处理。

if(NULL == p_cmd_packet)
{
    //! handle memory allocation error here
}

您还需要在使用完毕后释放此内存。

free(p_cmd_packet);

我看到您正在开发的代码是针对嵌入式微控制器 stm32f429 的。您还需要检查启动程序集文件,了解有多少堆 reserved/configured 供应用程序使用。因此,您可以处理内存分配。

我在这里看到另一个潜在问题:

HAL_UART_Transmit(&huart1, cmd_packet, 2, 100);

理想情况下,如果我是你,并使用 sprintf() 填充数据,我会读取 sprintf() 函数的 return 值,并使用该值作为要传输的字节数。 截至目前,除非我知道传递给 HAL_UART_Transmit().

的确切参数,否则我无法对此发表更多评论

来自 sprintf 上的公开组页面:

int sprintf(char *s, const char *format, ...);

The sprintf() function places output followed by the null byte, '[=14=]', in consecutive bytes starting at *s; it is the user's responsibility to ensure that enough space is available.

cmd_packet(此处)分配足够的内存是用户的责任。但是你没有分配任何内存给 cmd_packet.

使用malloc分配足够的内存cmd_packet