2017-04-11 4 views
-1

以下のコードでは、関数mraa_spi_write_buf()を使用して次の警告が表示されます。c-errorコンパイル時に配列名がポインタに壊れる

警告:割り当ては、キャストせずにポインタの整数を行う [-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

"配列名がポインタの中で崩壊すると思ったのですか?" - 常にではない。配列はポインタではありません。あなたが何をしようとしているのかははっきりしていません。それはまったく意味がありません。 – Olaf

+0

まあ、ほとんど*いつも。例外は「sizeof」演算子、「_Alignof」演算子、または単項演算子のオペランドである場合、または配列を初期化するために使用される文字列リテラルである場合」(C2011,6.3.2.1/3)。しかし、それはあなたのコード内の問題とは関係ありません。 –

答えて

1

の関数宣言が問題パラメータ、その戻り値ではない、関数は、その後整数に割り当てるポインタを返します変数read_data[0]

1

私は配列名がcでポインタに崩壊すると考えましたか?

この名前は、配列の最初の要素へのポインタとして使用できますが、この場合を除いて、これは当てはまりません。

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のおかげであなたが値を取得するために間接参照する必要があるので

あなたの関数が戻ると、* int型。

+0

[documentation here](https://iotdk.intel.com/docs/master/mraa/spi_8h.html#a794395b9eae7ed095c63beb76e8e6930)が見つかりました。返されるポインタは、呼び出し元によって解放されなければならないmallocされた記憶域へのポインタです。したがって、即時の問題を修正してもバッファはリークします。 – JeremyP

関連する問題