1

我使用 vmalloc 分配一个连续的虚拟内存块。然后我使用 memset 将此块的所有字节设置为 0。然后,我用我创建的 16 字节大小的数据结构填充这个内存区域。

然后,在我的一个函数中,我放置一个指向其中一个结构的指针,并开始沿着内存区域查找第一个 0 字节,以便我可以在此处放置另一个数据结构。我的第一个指针正确地获取了先前放置的结构,并且我可以看到地址。这是打印输出:

point's filename / //文件名 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 开头。

4

2 回答 2

3

除了 Sebastian 分析的仅返回 NULL 的逻辑之外,您可能还需要查看其他一些内容...

考虑替换point = (point++);为...

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

此外,这个函数的圈复杂度似乎有点高。如果真的没有办法简化该逻辑,那么至少将其分解为两个或三个功能,每个功能做出更少的决定。

于 2012-12-14T19:53:15.390 回答
2

您在 2 种情况下离开循环:

  • 如果 point 为 NULL,则在这种情况下返回 NULL。
  • 如果 dirnum 为 16。在这种情况下,您将递归调用该函数,并且还将返回 NULL。

所有其他返回语句也返回 NULL。

于 2012-12-14T19:31:38.677 回答