2017-04-11 66 views
-1

在下面的代碼,我得到使用功能mraa_spi_write_buf()以下警告。數組名腐爛在C指針 - 錯誤編譯

警告:賦值時將指針整數,未作鑄造 [-Wint變換]的read_data [0] = mraa_spi_write_buf(SPI,CMD,2);

我認爲數組名衰減到C指針?

這是功能

uint8_t * mraa_spi_write_buf (mraa_spi_context dev, uint8_t *data, int length).

#include "mraa.h" 
#include <stdio.h> 
#include <unistd.h> 

int main() 
{ 

uint8_t cmd[2] = {0xAA, 0xFF}; 
uint8_t read_data[2]; 

read_data[0] = mraa_spi_write_buf(spi, cmd, 2); 

} 
+0

你正在分配一個數組嗎?仔細觀察!什麼是'read_data [0]'的類型? – datell

+0

「我認爲數組名稱衰減到c中的指針?」 - 不總是。數組不是指針。目前還不清楚你在嘗試什麼;這是完全沒有道理的。 – Olaf

+0

那麼,*幾乎*總是。例外情況列舉如下:「當它是'sizeof'運算符的操作數,'_Alignof'運算符或一元'&'運算符,或者是用於初始化數組的字符串文字」(C2011,6.3.2.1/ 3)。但是這與代碼中的問題無關。 –

回答

1

的問題是不是參數,它的返回值的函數聲明,函數返回一個指針,你然後分配給整數變量read_data[0]

1

我認爲數組名衰減到C指針?

您可以使用數組名稱作爲指向數組第一個元素的指針,但除此情況外,這不是真實的。

你的函數返回int *,所以你需要取消引用來獲取值:

uint8_t* recv; 
recv = mraa_spi_write_buf(spi, cmd, 2) 
if(recv != NULL) 
{ 
    read_data[0] = *(mraa_spi_write_buf(spi, cmd, 2)); 
} 
else 
{ 
    //Handle error 
} 
free(recv); 

編輯:感謝您的修正@JeremyP。

+0

我找到了[documentation here](https://iotdk.intel.com/docs/master/mraa/spi_8h.html#a794395b9eae7ed095c63beb76e8e6930)。返回的指針是malloc'd存儲器,必須由調用者釋放,所以你的片段雖然修復了即時問題,但會泄漏緩衝區。 – JeremyP