为什么在 char 数组的字符之间插入“\000”字符?

问题描述

我正在尝试从 UART 读取传入的数据流,并尝试将收到的每个字符添加char 数组中,直到收到字符 \r\n(在那个订单)。

我编写了一个函数 (char read_uart()) 来等待接收到单个字符时返回。此函数正确接收并返回单个字符,因为它应该。

在此函数之上,我尝试创建另一个函数,它应该读取每个字符并将它们添加到数组中,直到收到终止组合。就是这样:

void read_full_uart(char *message[4096])
{
    char prevIoUsTwo[2] = {'\0','\0'};
    for (uint16_t i = 0; !(prevIoUsTwo[0] == '\r' && prevIoUsTwo[1] == '\n'); i++)
    {
        char currentValue = read_uart();
        *(message + i) = currentValue;

        prevIoUsTwo[0] = prevIoUsTwo[1];
        prevIoUsTwo[1] = currentValue;
    }
}

这就是我的称呼:

char message[4096];
read_full_uart(&message);

但是,例如传输“比特币”时,message 是这样的:

b\000\000\000i\000\000\000t\000\000\000c\000\000\000o\000\000\000i\000\000\000n\000\000\000\r\000\000\000\n\000\000\000

字符被完整接收,但附加了三个 \000 字符。

我想知道为什么会发生这种情况,以及如何调整它以便不插入这些额外的字符。

解决方法

这里有两个问题。

首先,您传递给函数的不是它所期望的。 &message 的类型为 char (*)[4096],即指向 char 大小为 4096 的数组的指针。同时,该函数需要一个 char *[4096],即 char * 大小为 4096 的数组。这是类型不匹配。

第二个是在这一行:

*(message + i) = currentValue;

或等效地:

message[i] = currentValue;

您正在将 char 分配给类型为 char * 的数组。这也是类型不匹配。

这个问题应该被编译器发现作为警告。如果没有,请通过传递选项 -Wall -Wextra(假设为 gcc)来提高警告级别,并将警告视为错误。

您可以通过将函数更改为采用 char 数组来修复这些错误:

void read_full_uart(char message[4096])

或等效地:

void read_full_uart(char *message)

并通过将数组直接传递给函数:

read_full_uart(message);