0

C コードでバイナリ データ パケットを作成する必要があります。ただし、いくつかの基本的な点が欠けています。現在、すでに構造体が定義されており、それらを使用する必要があります (少なくともパケット データの読み取りには)。受信パケットと送信パケットの両方に同じ構造が使用されます。パケット構造体は次のとおりです。

typedef struct {

  uint8_t packetType;
  uint16_t packetBody;

} MyStruct;

および別の構造体:

typedef union {

  const uint8_t *bytes; 
  MyStruct *packet;

} MyPacket;

構造体へのポインターを受け取り、データを入力して返す関数は次のとおりです。

void packetWithBytes(MyPacket *packet)
{
  packet->packet->packetType = 1; // crashed with EXC_BAD_ACCESS
  packet->packet->packetBody = 3;
}

バイナリ データへのポインターを返す必要がある関数の呼び出しを次に示します。

MyPacket *packetRef;
packetWithBytes(packetRef); 

NSData *data = [NSData dataWithBytes:packetRef->bytes length:sizeof(packetRef->bytes)];

どこかに(を使用して)スペースを割り当てる必要があると感じてmallocいますが、どこでどのように行うべきかわかりません。呼び出し側のコードは、パケットのサイズに関する詳細を認識してはなりません。割り当てを試みましたが、同じエラーが発生しました:

void packetWithBytes(MyPacket *packet)
{
  packet->bytes = malloc(sizeof(uint8_t) + sizeof(uint16_t)); //crash
  packet->packet->packetType = 1;
  packet->packet->packetBody = 3;
}

メンバー バイトから削除しようとしましたが、同じエラーが発生しましconstた。MyStruct私はCにあまり慣れていないので、助けていただければ幸いです。

4

1 に答える 1

4
MyPacket *packetRef;
packetWithBytes(packetRef);

が問題です。packetRefは初期化されていないポインタであり、無効なメモリ位置を指している可能性があります。逆参照は未定義の動作です。これは次の 2 つの方法で解決できます。

MyPacket *packetRef = malloc(sizeof(*packetRef));
packetWithBytes(packetRef);

また

MyPacket packetRef;
packetWithBytes(&packetRef);
于 2012-11-05T18:31:46.753 に答える