3

CプロジェクトにMallocを手動で実装しようとしています。これが私のコードです:

void *Mem_Alloc(int size) {
    struct Node *p, *prevp = head;

    if (fitPolicy == P_BESTFIT) {

    }

    if (fitPolicy == P_FIRSTFIT) {
        for (p = prevp->next; ;prevp = p, p = p->next) {
            if (p->size >= size) {
                if (p->size == size)
                    prevp->next = p->next;
                else {
                    p->size -= size;
                    p += p->size;
                    // p->size = size;
                }
                head = prevp;
                return (void *)(p+1);
            }
            if (p == head) {
                return NULL;
            }
        }
    }

    if (fitPolicy == P_WORSTFIT) {

    }
    return NULL;
}

基本的に、私は;mmapと呼ばれる別のメソッドを呼び出します。Mem_Init次に、返されたメモリマップは変数によって示されますhead。の途中のコメント部分で常にセグメンテーション違反が発生しMem_Allocます。何故かはわからない。皆さん、これを手伝ってくれませんか?いくつかのヒント?

4

2 に答える 2

2

確実に判断することは不可能ですが、これは、バイト単位p += p->sizeでインクリメントpすることを期待しているためである可能性があります。p->size実際には、これはp->sizeのサイズの倍でそれを増分します*p。割り当てようとしているサイズが使用可能なメモリのサイズの半分未満の場合、*p2バイトしかない場合でも、ポインタが末尾を超えて移動します。

これを修正するには、ポインタを文字ポインタにキャストして加算する必要があります。

((char*)p) += p->size;
于 2012-11-04T05:02:14.517 に答える
2

ughoavgfhwの方向は正しいですが、左辺値のキャストは適切ではありません。

次を使用できます。

void * tmp_p = (void *)p;
tmp_p += p->size;
p = (struct Node *)tmp_p;
于 2012-11-04T05:10:33.667 に答える