0

このコードを理解するのは難しいです:

特にこの部分:

     // check that the stuff we wrote has not changed
     if(n[k][0]!=(unsigned char)(n[k]+s[k]+k))
        printf("Error when checking first byte!\n");
     if(s[k]>1 && n[k][s[k]-1]!=(unsigned char)(n[k]-s[k]-k))
        printf("Error when checking last byte!\n");

プログラム全体がWindowsの機能を模倣しようとしmallocますfree。Windowsで実行する必要があります。

誰でもこれらの2つのifがどのように機能するかを説明できますか?

ありがとう。

4

2 に答える 2

4

コードは、もう少しコンテキストがあればより意味があります。

// used to store pointers to allocated memory
unsigned char *n[NO_OF_POINTERS]; 

int s[5000]; // used to store sizes when testing

....

for(i=0;i<NO_OF_ITERATIONS;i++) {
   k=myrand()%NO_OF_POINTERS; // pick a pointer
   if(n[k]) { // if it was allocated then free it
      // check that the stuff we wrote has not changed
      if(n[k][0]!=(unsigned char)(n[k]+s[k]+k))
         printf("Error when checking first byte!\n");
      if(s[k]>1 && n[k][s[k]-1]!=(unsigned char)(n[k]-s[k]-k))
         printf("Error when checking last byte!\n");
      FREE(n[k]);
   }
   size=randomsize(); // pick a random size
             size=1;
   n[k]=(unsigned char *)MALLOC(size); // do the allocation
   s[k]=size; // remember the size
   n[k][0]=(unsigned char)(n[k]+s[k]+k);  // put some data in the first and
   if(size>1) n[k][size-1]=(unsigned char)(n[k]-s[k]-k); // last byte
}

n[k]最後の2行は、ポインター値( )、割り当てのサイズ(s[k])、およびポインターインデックス( )に基づく式を使用して、最初と最後のバイトを値に設定しますk。この式には意味がありません。ポインタの割り当てごとに異なる、格納される値の計算にすぎません。

強調表示したifステートメントは、メモリを解放する前に、最初の()バイトn[k][0]と最後の( )バイトの値が変更されていないことを確認します。n[k][s[k]-1]コードは基本的にVirtualAllocVirtualFree関数のテストハーネスです。

于 2012-10-03T22:52:00.257 に答える
0

nの多次元配列のように見えますunsigned char。最初の行:

if(n[k][0]!=(unsigned char)(n[k]+s[k]+k))

サブ配列の最初の要素がキャストn[k]の合計と等しくないことを確認しています(n[k]+s[k]+k)unsigned char

2行目:

if(s[k]>1 && n[k][s[k]-1]!=(unsigned char)(n[k]-s[k]-k))

k配列のth要素がs1より大きいかどうか、および(論理的で)s[k]-1サブ配列の要素が次n[k]の結果と等しくないかどうかをチェックしているようです。(n[k]-s[k]-k)

全体的に、それはかなり悪いコードであり、いくつかのより良い変数名で行うことができます!

于 2012-10-03T22:52:40.687 に答える