2013-06-19 46 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