2013-06-19 124 views
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; 
} 

Full Source

的printf结果:

int GPIO::GetValue() 0cx$??ݾ??˶[email protected] 

我不知道是什么在这上面出错了。我在一些简单的程序中提取了相同的代码,可以正常工作。还有一些其他功能GPIO :: GetDirection这是相同的,也工作正常。我想有一些内存,指针,分配问题。

什么问题?

Bodo

回答

3

我想你正在得到正确的结果。只需null即可终止字符串data。其实你不需要声明一个数组。只需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; 
} 
+0

我得到格式STRNCMP“%C”需要类型“诠释”的说法,但参数2有类型'char *' – bodokaiser

+0

??!在我的例子中,参数2的类型为'char',它可以很好地用'%c'工作。我只是说明了如何使用'data'实现相同的功能,而不是'char *'。 –

1

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

1

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

printf("int GPIO::GetValue() %c\n", data[0]);如果你留在大小为1

的数组,你的strcmp可能会失败,请尝试使用一个大小为1