2012-10-03 165 views
0

我很難理解這種piece of code代碼解釋

特別是這部分:

 // 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的mallocfree功能。 它必須在Windows上運行。

任何人都可以解釋這2個ifs是如何工作的?

謝謝。

+0

你能展示更多的代碼嗎? 'n'和's'和'k'如何聲明?我猜可以,但如果你添加它會更好:) – peacemaker

+0

請更清楚地解釋它是什麼關於使你感到困惑的代碼,並相應地更新問題標題,以便將來對其他人有用。否則,它可能因爲太本地化而關閉。 –

回答

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])字節的值沒有更改。該代碼基本上是VirtualAllocVirtualFree函數的測試工具。

+0

感謝隊友,我試圖理解那個瘋狂的功能,但現在它變成絕對數學上的廢話,那麼整個事情現在開悟了! –

+1

讓我們聽聽它的詳細命名變量:) – Deanna

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)) 

似乎正在檢查數組sk th元素是否大於一個AND(邏輯和)子數組n[k]中的元素s[k]-1不等於al對(n[k]-s[k]-k)

的結果總的來說,這是一些非常糟糕的代碼,可以用一些更好的變量名來做!

+0

啊我剛剛注意到鏈接OP給了http://ideone.com/pkhGL,這給了更多的上下文。 @ AndrewCooper的回答比較好 – peacemaker