2012-12-14 185 views
1

後NULL我使用vmalloc的分配一個連續的虛擬存儲器塊。然後,我使用memset將該塊的所有字節設置爲0。然後,我用我創建的大小爲16字節的數據結構填充此內存區域。指針變爲遞增

然後,我的功能之一時,我把一個指向這些結構中的一個,並開始走在存儲區域找到的第0字節,這樣我可以在這裏放置另一個數據結構。我的第一個指針正確地獲取了以前放置的結構,並且我可以看到地址。這是打印輸出:

點的文件名/ //文件名 ffffc9001095b500 //地址

這是對這種結構的正確的存儲區(因爲我把它放在這裏)。

然後,我增加我的指針,這應該帶我到內存區域ffffc9001095b510, ,但相反,我的指針返回的地址爲NULL。爲什麼是這樣?

下面的代碼:

void * check_aux(char * upPath, int index, int location){ 
struct directory * point;  
int i = 0; 
int dirnum = 0; 
//int lastaddr; 
printk("Inside check_aux\n"); 

if(location > 117){ 
    return NULL; 
} 
else if(upPath == NULL){ 
    return NULL; 
} 
else{ 
    point = getLocation(index, location); 
    printk("This is point's filename %s\n%p\n", point->filename, point);   
    while(point != NULL && dirnum < 16){ 

     while(point->filename[i] == upPath[i] || (point->filename[i] == 0 && (upPath[i] =='/' || upPath[i] == 0))){ 
      printk("%c == %c\n", point->filename[i], upPath[i]); 
      if(point->filename[i] == 0 && upPath[i] == 0){ 
       return NULL; 
      } 
      else if(point->filename[i] == 0 && upPath[i] == '/'){ 
       if(nodes[point->index].type[0] == 'd'){ 
        return check_aux(&upPath[i+1], point->index, 0); 
       } 
       else{ 
        return NULL; 
       } 


      } 
      else{ 
       i++; 
      } 

     } 
     dirnum++; 
     (point++); 
    } 
    if(dirnum == 16){ 
     return check_aux(upPath, index, location+1); 
    } 
    printk("Returning point %p\n", point); 
    return point; 
} 

} 

的數據結構定義爲

struct directory{ 
char filename[14]; 
short index; 

}; 

和文件名不能以0

回答

2

您2例退出循環開始:

  • 如果點爲NULL,在這種情況下你返回NULL。
  • 如果dirnum是16.在這種情況下你遞歸調用的功能,也將返回NULL。

所有其他return語句返回NULL,太。

+0

啊,這麼一個簡單的錯誤。 TY。 – Magn3s1um

3

除了塞巴斯蒂安,只有返回NULL,還有你可能需要查看一些其他的東西所分析的邏輯...

考慮與任何更換point = (point++); ...

++point; 
point++; 
point += 1; 

而且,這個功能的cyclomatic complexity看起來有點高。如果真的沒有辦法簡化這個邏輯,那麼至少將其分解成兩個或三個功能,每個功能都會減少決策。