繁体   English   中英

read()缓冲区具有无效数据(指针问题?)

[英]read() buffer has invalid data (pointer issue?)

我有一个问题,以下函数中的数据数组有一些糟糕的值(在我看来就像一些内存位置):

int
GPIO::GetValue() {
    char data[1];

    if (read(_valuefd, data, 1) < 0) {
        perror("Error on reading value fd");
        return -1;
    }

    printf("int GPIO::GetValue() %s\n", data);

    if (strcmp(data, "1") == 0) {
        return GPIO_VALUE_ON;
    }
    if (strcmp(data, "0") == 0) {
        return GPIO_VALUE_OFF;
    }

    return -1;
}

完整资料

printf的结果:

int GPIO::GetValue() 0cx$??ݾ??˶8@l

我不知道这是怎么回事。 我在一些可以正常工作的简单程序中提取了相同的代码。 还有其他一些功能GPIO :: GetDirection可以执行相同的操作,并且效果很好。 我猜这里有一些内存,指针,分配问题。

怎么了?

博多

我认为您得到正确的结果。 只是null终止字符串data

char data[2];
data[1] = '\0';

实际上,您不需要声明数组。 只是char data; 足够。 那么您可能需要进行以下更改:

char data;
if (read(_valuefd, &data, 1) < 0) {
        perror("Error on reading value fd");
        return -1;
    }

printf("int GPIO::GetValue() %c\n", data);

if (data == '1') {
    return GPIO_VALUE_ON;
}
else if (data == '0') {
    return GPIO_VALUE_OFF;
}
else {
    return -1;
}

“数据”数组的长度为1个字节。 如果要以字符串形式打印,则必须以“ \\ 0”结尾。 或者,尝试使用%c代替%s。

printf("int GPIO::GetValue() %s\\n", data); 您尝试显示一个字符*。 但是由于数组的大小为1,printf不知道何时停止读取,因为他找不到'\\ 0'。

printf("int GPIO::GetValue() %c\\n", data[0]); 如果您使用大小为1的数组

而且您的strcmp可能会失败,请尝试使用大小为1的strncmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM