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 上运行。

任何人都可以解释这两个 ifs 是如何工作的?

谢谢。

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])、分配大小 ( s[k]) 和指针索引 ( k) 的公式将第一个和最后一个字节设置为值。这个公式没有任何意义,它只是计算要存储的值,对于不同的指针分配会有所不同。

您突出显示的if语句检查第一个 ( n[k][0]) 和最后一个 ( n[k][s[k]-1]) 字节的值在释放内存之前没有更改。该代码基本上是VirtualAllocandVirtualFree函数的测试工具。

于 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

第二行:

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

似乎正在检查k数组的第 th 个元素s是否大于一个 AND(逻辑与)s[k]-1子数组n[k]中的元素不等于的结果(n[k]-s[k]-k)

总的来说,这是一些非常糟糕的代码,可以使用一些更好的变量名!

于 2012-10-03T22:52:40.687 回答