私は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;
}
奇数を。このコードw/gccを実行すると、次のエラーが表示されます。オブジェクトのエラー***6868cf0:解放されたオブジェクトのチェックサムが正しくありません。オブジェクトは解放された後に変更されている可能性があります。 ***デバッグにmalloc_error_breakのブレークポイントを設定します。しかし、コードをステップ実行するとうまくいきます。 –
サポートされているプラットフォームのいずれかでValgrindを使用していると、はるかに早く明確になるでしょう。もちろん、古いGDBだけでも動作します。 – 0xC0000022L