1

次のコードを理解するのに苦労しています。

int stride = 512;
int max_len = 1024 * stride; 
char *addr = (char *)malloc(max_len);
for (int i=stride; i<max_len; i += stride)
    *(char **)&addr[i-stride] = (char*)&addr[i];
*(char **)&addr[i-stride] = (char*)&addr[0];

コードを見ると、これはある種の循環リンクリストを作成しようとしているようです。しかし、私はそれらのキャストが実際に何をしているのか分かりません。

4

1 に答える 1

5

私見あなたが提示するコードは味が悪いです。

*(char **)&addr[i-stride] = (char*)&addr[0];addr動的に割り当てられたゾーンへ のポインターを取得し(右側の部分はより簡単(char*)&addr[0]に記述できますaddr)、そのアドレスを位置にあるメモリにコピーしますaddr[i-stride]

これは、実際には間違っている可能性があります (未定義の動作)。たとえば、一部のプロセッサ&addr[i-stride]で (これは と書くことができますaddr+i-stride) がワードで整列されていない場合です。あなたの場合、iたまたま512であるため、アドレスはワードで整列されています(適切に整列されたゾーンが得られるため)。max_lenstridemalloc

コードの元の作成者は、おそらく次のように a struct(またはおそらく a union)を宣言する必要があります。

 struct buffer_st {
    struct buffer_st* next;
    char content[];
 };
于 2012-10-17T05:06:50.390 に答える