1

vmalloc を使用して、連続した仮想メモリ ブロックを割り当てます。次に、memset を使用して、このブロックのすべてのバイトを 0 に設定します。次に、このメモリ領域を、作成したサイズが 16 バイトのデータ構造で埋めます。

次に、関数の 1 つ中に、これらの構造体の 1 つへのポインターを配置し、メモリ領域を下って最初の 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 で開始することはできません。

4

2 に答える 2

3

NULL のみを返す Sebastian によって分析されたロジックに加えて、確認したいことが他にもいくつかあります...

point = (point++);...のいずれかに置き換えることを検討してください。

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

また、この関数の循環的複雑度は少し高いようです。そのロジックを単純化する方法が本当にない場合は、少なくとも 2 つまたは 3 つの関数に分割して、それぞれの決定が少なくなります。

于 2012-12-14T19:53:15.390 に答える
2

次の 2 つのケースでループを終了します。

  • ポイントが NULL の場合、NULL を返します。
  • dirnum が 16 の場合。この場合、関数を再帰的に呼び出すと、NULL も返されます。

他のすべての return ステートメントも NULL を返します。

于 2012-12-14T19:31:38.677 に答える