我使用vmalloc来分配连续的虚拟内存块。然后我使用memset将该块的所有字节设置为0。然后,我用我创建的数据结构填充这个内存区域,大小为16字节。
然后,在我的一个函数中,我将指针指向其中一个结构,然后开始沿着内存区域向下走,找到第一个0字节,这样我就可以在这里放置另一个数据结构。我的第一个指针正确地获取了先前放置的结构,我可以看到地址。这是打印输出:
point的文件名/ //文件名 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开头。
答案 0 :(得分:3)
除了Sebastian分析的逻辑只返回NULL之外,还有一些其他的东西你可能想要查看......
考虑将point = (point++);
替换为任何......
++point;
point++;
point += 1;
此外,此功能的cyclomatic complexity似乎有点高。如果真的没有办法简化逻辑,那么至少要将它分解成两个或三个函数,每个函数做出的决策都会减少。
答案 1 :(得分:2)
你将循环放在两种情况下:
所有其他return语句也返回NULL。