将 char 数组传递给方法时,数组会丢失其值

When char array is passed to a method, the array looses its value

我有接受“constant char*”作为参数的方法。但是当我将下面的数组传递给方法“*SendUartMessage(int uartFd, const char dataToSend)**”时,只有前两个十六进制值显示在参数的方法中。准确地说,因为第三个值是零 0x00,它会阻止在方法内部传递的其他值。任何人都可以提供解决方案以在方法内传递所有数组值。

const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
            SendUartMessage(uartFd, updateAllChannelData);

这是方法

static void SendUartMessage(int uartFd, const char* dataToSend)
{
    size_t totalBytesSent = 0;
    size_t totalBytesToSend = strlen(dataToSend);
    int sendIterations = 0;
    close(r1PinFd);
    r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_High);
    while (totalBytesSent < totalBytesToSend) {
        sendIterations++;

        // Send as much of the remaining data as possible
        size_t bytesLeftToSend = totalBytesToSend - totalBytesSent;
        const char* remainingMessageToSend = dataToSend + totalBytesSent;
        ssize_t bytesSent = write(uartFd, remainingMessageToSend, bytesLeftToSend);
        if (bytesSent == -1) {
            Log_Debug("ERROR: Could not write to UART: %s (%d).\n", strerror(errno), errno);
            exitCode = ExitCode_SendMessage_Write;
            return;
        }

        totalBytesSent += (size_t)bytesSent;
    }
    int c, d;

    sleep(5);
    close(r1PinFd);
    r1PinFd = GPIO_OpenAsOutput(MIKROE_PWM, GPIO_OutputMode_PushPull, GPIO_Value_Low);

    Log_Debug("Sent %zu bytes over UART in %d calls.\n", totalBytesSent, sendIterations);
}

您在非字符串的字符数组上使用 strlen

C 中的字符串以 null 结尾,这意味着值为 0 的字节结束字符串。您没有字符串,而是有效值包括 0 的字节数组。

您需要将数组的大小作为单独的参数传递给函数。

该数组在索引 2 处有一个 0 字节。strlen 计算 C 字符串的长度,即一个空终止(0 字节终止)数组。将您的数组视为字符串,长度为 2。如果您想知道数组的实际长度,则必须将其作为参数传递:

const char updateAllChannelData[] = { 0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData, sizeof(updateAllChannelData));

static void SendUartMessage(int uartFd, const char* dataToSend, size_t totalBytesToSend)
{
   ...
}

Can any one provide solution to pass all the array value inside the method.

在C中,当一个数组被传递给一个函数时,数组首先被转换为第一个元素的类型和地址。

const char updateAllChannelData[] = { 
    0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
SendUartMessage(uartFd, updateAllChannelData);

SendUartMessage() 接收到指向 updateAllChannelData[0] 的指针, 而不是 数组。


为了SendUartMessage()知道要使用多少数组,还要传递数组元素计数并重新写入SendUartMessage()以接受计数。

static void SendUartMessage(int uartFd, size_t count, const char* dataToSend);

const char updateAllChannelData[] = { 
    0x01, 0x06, 0x00, 0x19, 0x00, 0x01, 0x99, 0xCD };
size_t count = sizeof updateAllChannelData / sizeof updateAllChannelData[0];
SendUartMessage(uartFd, count, updateAllChannelData);