【问题标题】:read() buffer has invalid data (pointer issue?)read() 缓冲区有无效数据(指针问题?)
【发布时间】:2013-06-15 13:12:36
【问题描述】:

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

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;
}

Full Source

printf的结果:

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

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

出了什么问题?

博多

【问题讨论】:

    标签: c++ c arrays pointers io


    【解决方案1】:

    我认为你得到了正确的结果。只需 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;
    }
    

    【讨论】:

    • 我得到的格式“%c”需要“int”类型的参数,但参数 2 的类型为“char*”
    • ??!在我的示例中,参数 2 的类型为 char,它可以与 %c 一起正常工作。我只是说明了我们如何使用data 实现与char 相同的功能,但不是char*。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-04
        • 2012-06-09
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多