0

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

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也可以正常工作。我想有一些内存,指针,分配问题。

出了什么问题?

博多

4

3 回答 3

3

我认为你得到了正确的结果。只是 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;
}
于 2013-06-19T06:00:14.183 回答
1

'data' 数组的长度为 1 个字节。如果要将其打印为字符串,则必须以 '\0' 结尾。或者,尝试使用 %c 而不是 %s。

于 2013-06-19T06:00:23.280 回答
1

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

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

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

于 2013-06-19T06:00:37.640 回答