1

ヘッダー ファイルで、次のように配列と配列の長さを持つ構造体を宣言します。

typedef struct {
    unsigned char *frame;
    int length;
} ResponseFrame ;

extern ResponseFrame rf;

私のメインファイルには、次のものがあります。

ResponseFrame rf;

int main(void)
{
   while(1) {
      if (receive() == 0x01) {
         uint8_t val;
         rf.length = 6;
         for(int i = 0; i < 6; i++){
            val = receive();
            rf.frame[i] = val;
            transmit(val);            // LINE 1
         }


         for (uint8_t i=0; i<rf.length; i++){
            transmit(rf.frame[i]);    // LINE 2
         }
      }
   }
}

私が受け取っている配列は

{ 00 00 FF 00 FF 00 }

最初の送信は、この受信データで応答します [LINE 1 を参照] 。しかし、グローバル変数 rf.frame を使用して送信しようとすると [LINE 2 を参照]、最初の値が次のように異なります ----

{ 13 00 FF 00 FF 00 }

なぜその最初の初期値はこのように異なるのですか??

4

2 に答える 2

2

にメモリを割り当てないためResponseFrame.frame、未定義の動作が発生しています。

rf.length = 6;を実行することで のサイズがunsigned char *frame;魔法のように大きくなると想定していますが、そうではありません。

サイズが確かな場合は、次のものが必要です。

rf.length = 6;
rf.frame = malloc(sizeof(unsigned char) * 6);   //for C

またはstd::vectorC++ で a を使用します。

于 2012-08-10T21:34:20.537 に答える
1

問題の一部は、未定義の動作に依存しているように見えることかもしれません。(示されたコードから)frame初期化されていないように見えます。固定サイズの場合、次のように宣言できます。

unsigned char frame[6];

mallocそれ以外の場合は、メモリを割り当てるために を呼び出す必要がある場合があります。

于 2012-08-10T21:35:02.303 に答える