2012-03-02 10 views
0

私はCで多項式演算を実装しています。私は整数の係数と多項式の次数を格納するために動的構造体を使用します。 他の関数のほかに、私は操作p [X] * Xが必要なので、何らかの右シフトを実装しようとします。繰り返し呼び出しの後でrealloc()が失敗する

しかし、数回シフトすると、realloc()がプログラムをクラッシュさせます。この例では3回目の呼び出しですが、2回と4回シフトしようとすると、2回目以降はクラッシュします。

/* Simple polynom type with variable length and degree n-1. */ 
typedef struct { 
    int n; 
    int *factors; 
} polynom_t; 


polynom_t *poly_init(int n) { 
    polynom_t *p_new = malloc(sizeof(polynom_t)); 
    p_new->n = n; 
    p_new->factors = calloc(n, sizeof(int)); 

    return p_new; 
} 

void poly_clear(polynom_t *p) { 
    free(p->factors); 
    free(p); 
    p = NULL; 
} 


void poly_set(polynom_t *p, int a[], int len){ 
    memcpy(p->factors, a, sizeof(int)*p->n); 
} 


void _poly_rsz(polynom_t *p, int n) { 
    if (n != p->n) { 
     p->n = n; 

     // This realloc() seems to fail 
     p->factors = realloc(p->factors, sizeof(int) * n); 
    } 
} 


void _poly_lsr(polynom_t *p, int i) { 
    _poly_rsz(p, p->n + i); 
    memmove(p->factors + i, p->factors, sizeof(int)*(p->n)); 
    memset(p->factors, 0, sizeof(int)*i); 
} 


int main(int argc, char **argv) { 
    polynom_t *p2 = poly_init(11); 
    int a2[11] = {1, 2, 0, 2, 2, 1, 0, 2, 1, 2, 0}; 
    poly_set(p2, a2, 11); 
    _poly_lsr(p2, 1); // works as expected 
    _poly_lsr(p2, 1); // works as expected 
    _poly_lsr(p2, 1); // crash 
    poly_clear(p2); 

    return 0; 
} 
+0

奇数を。このコードw/gccを実行すると、次のエラーが表示されます。オブジェクトのエラー***6868cf0:解放されたオブジェクトのチェックサムが正しくありません。オブジェクトは解放された後に変更されている可能性があります。 ***デバッグにmalloc_error_breakのブレークポイントを設定します。しかし、コードをステップ実行するとうまくいきます。 –

+0

サポートされているプラ​​ットフォームのいずれかでValgrindを使用していると、はるかに早く明確になるでしょう。もちろん、古いGDBだけでも動作します。 – 0xC0000022L

答えて

5

ここでの問題は、コードのこのブロックである:

void _poly_lsr(polynom_t *p, int i) { 
    _poly_rsz(p, p->n + i); 
    memmove(p->factors + i, p->factors, sizeof(int)*(p->n)); // the problem is here! 
    memset(p->factors, 0, sizeof(int)*i); 
} 

あなたは多項式のサイズを変更すると、あなたはそれが意味のカウント、あなたは1を追加しているとき、あなたはの境界をオーバーフローしているのですリセット1.によってあなたの多項式の配列は、単にmemmoveカウントからiを引き、修正するには:

memmove(p->factors + i, p->factors, sizeof(int)*(p->n - i)); 
+0

ありがとうございました。私の友人たちと映画を見て5時間を過ごした後、それはとても明白で、私はちょっと恥ずかしい気がします。 – Cybermage

関連する問題