0

ここでは、input から struct dev にデータを読み取りたいので、temp = (dev*) input を使用して char* から dev* にキャストしています。私のマシンでは、行printf("%p\n", temp); 0x804a040 を出力し、true の場合は行printf("%p\n", temp+1); を出力します。0x804a04b を出力するはずですが、0x804a04c を出力しました。行printf("%p\n", &temp->size); 0x804a047 を出力するはずですが、0x804a048 を出力しました。

私が誤解していることや間違っていることを理解するのを手伝ってください

@all: ご協力ありがとうございます。わかった。私はいくつかの投稿を読みましたが、ソリューションは #paragma pack(1) またはこのようなディレクティブを使用しています。しかし、それは precessor の処理を​​遅くするので、お勧めできません。それで、これについて他のアイデアはありますか?

感謝!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct dev
{
    short id;
    char name[5];
    int size;
} dev;

char input[] = {  0x03, 0x00, 0x65, 0x67, 0x03, 0x00, 0x43, 0x09, 0x00, 0x00, 0x00,
                  0x00, 0x00, 0x65, 0x67, 0x03, 0x00, 0x43, 0x43, 0x00, 0x43, 0x00,
                  0x03, 0x00, 0x65, 0x67, 0x03, 0x00, 0x43, 0x43, 0x00, 0x43, 0x00,
                  0x03, 0x00, 0x65, 0x67, 0x03, 0x00, 0x43, 0x43, 0x00, 0x43, 0x00 };

int
main (int argc, char *argv[])
{
    dev* temp;
    temp = (dev*)input;

    printf("%p\n", temp);
    printf("%p\n", temp+1);

    printf("%d\n", temp->id);
    printf("%p\n", &temp->name[4]);
    printf("%p\n", &temp->size);
    temp++;
    printf("%d\n", temp->id);

    return 0;
}
4

5 に答える 5

0

コンパイラがパディングなしで構造体をアセンブルしたと仮定しました。チェックsizeof(dev)すると、あなたが思っているものにはなりません。

パディングの目的は、 int メンバー フィールドをワード (4 バイト) 境界に揃えることです。short は 2 で "name" は 5 であるため、 と の間に 1 バイトのパディングがnameありsizeます。

1 つの解決策は、name6 バイトにすることです。これは、一部の奇妙なコンパイラが奇妙なことをしないという保証ではありませんが、それはありそうにありません。コンパイラ固有の「pack」プラグマも使用できます。

おそらく最良の解決策は、入力をフィールドに個別にコピー マップすることです。

于 2013-09-10T17:03:52.060 に答える