1

私は変数を持っています:

uint8_t* data

そして、これらのデータにヘッダーを追加したいと思います。ちょうど2つの数字。次のようなデータが必要です: data+my_int+my_second_int

その後、データを関数 (変更できない) とデータのサイズに渡す必要があります。

このような :myfunction(data,size);

これは現在、私のコードがどのように見えるかです:

struct Data {
  uin8_t* data;
  uint32_t PTS;
  uint32_t DTS;
  uint16_t size_data;
};


struct Data* mydata;
mydata->data = data; // data I get before
mydata->size_daza = size; // size I get before
mydata->PTS = GST_BUFFER_PTS(buf);
mydata->DTS = GST_BUFFER_DTS(buf);

myfunction(mydata,sizeof(struct Data)); // My function , this function add also a header to my data (another).I can't access or modify this function.

この後、複数のことが起こり (何が問題ではない)、最後に別の関数が「myfunction」を追加したヘッダーを削除し、この関数によって与えられたデータを構造体 Data* にキャストします。DTS、PTS、サイズにアクセスできますが、データに SIGSEGV エラーがあります..

構造を変更する必要があると思いますが、ポインターなしでバッファーを格納する他の方法がわかりません。

4

2 に答える 2

0

それが構造の目的です。送信するデータの構造を定義します。

struct Data {
  uint8_t data;
  int first_int;
  int second_int;
  // possibly more
};

そして、占有されているメモリの先頭へのポインター (通常は a void *) と対応するサイズの形式で、送信関数に渡します。

struct Data * mydata = // ... wherever that comes from
send_somewhere(mydata, sizeof(struct Data));
// look at the API doc if you are still the owner of the
// memory and if so, free it (if it's no longer needed and
// has been dynamically allocated)

がどのようsend_somewhereに実装されているかによって (たとえば、 を使用しない場合 void *)、次のような場合にキャストする必要がある場合があります。

send_somewhere((uint8_t*)mydata, sizeof(struct Data));

考えられる欠点があります。最適化コンパイラによって構造体がパディングされる可能性があります。パディングとは、実際に送信する必要があるよりも多くのデータを送信することを意味します。コンパイラによっては、パディングを禁止する属性があります。

struct Data {
  // contenst
} __attribute__((__packed__)); // for gcc, and clang
于 2015-06-27T22:55:39.927 に答える
0

uint8_t ポインターを使用して、追加された int 値のアドレスにアクセスしている可能性があります。それらにアクセスするときは、 int* にキャストしてみてください。

あなたのコードを教えてください。

于 2015-06-27T23:08:57.060 に答える