0

Cでは、Unix環境(Plan9)で、メモリとして配列を取得しました。

uchar mem[32*1024];

その配列には、空きメモリと使用可能なメモリのサイズを示すint(整数)などのさまざまなフィールドを含める必要があります。だから、私はこれを試しました:

uchar* memp=mem;
*memp=(int)250; //An example of size I want to assign.

intのサイズが4であることを知っているので、キャストなどで強制する必要があります。この場合、memの最初の4つのスロットのコンテンツの数は250で、ビッグエンディアンです。

しかし、問題は、私が説明したことをやろうとすると、うまくいかないことです。型の変換に間違いがあると思います。うまくいけば、mem[0]からmem[3]にサイズが示され、intとして表され、ucharとして表されないようにするにはどうすればよいでしょうか。

前もって感謝します

4

4 に答える 4

2

このような:

*((int*) memp) = 250;

つまり、「memp文字へのポインタですが、整数へのポインタとして扱い、この整数を指す場所に置いてください」ということです。

于 2009-05-10T11:38:01.050 に答える
2

次のように、ユニオンの使用を検討しましたか。

union mem_with_size {
  int   size;
  uchar mem[32*1024];
};

そうすれば、キャスティングについて心配する必要はありません。(もちろん、バイトの順序についてはまだ心配する必要がありますが、それは別の問題です。)

于 2009-05-10T11:45:57.613 に答える
1

他の人が指摘しているように、intへのポインタにキャストする必要があります。また、ポインタの位置合わせを考慮に入れる必要があります。多くのアーキテクチャでは、intはsizeof(int)で割り切れるメモリ位置から開始する必要があり、位置合わせされていないintにアクセスしようとすると、 SIGBUS。他のアーキテクチャでは、動作しますが、ゆっくりです。さらに他では、それはすぐに動作します。

これを行うためのポータブルな方法は次のとおりです。

int x = 250;
memcpy(mem + offset, &x, sizeof(x));

ただし、ユニオンを使用するとこれが簡単になる可能性があるため、JamieHに+1します。

于 2009-05-10T12:02:36.323 に答える
0

ポインタをにキャストします。もう一度intではありません。unsigned char

int * memp = (int *)mem;
* memp = 250; //An example of size I want to assign.
于 2009-05-10T11:39:38.097 に答える