realloc
でディナム的に増加する配列を実装しようとしています。reallocのバグ - 配列の最後の要素をインクリメントする
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 20
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
:私はそれを実行したときに
#include <stdio.h>
#include <stdlib.h>
int *foo;
int quantity;
void add(int number) {
foo = (int*) realloc(foo, sizeof(foo) + sizeof(int));
foo[quantity] = number;
quantity++;
}
void debugFoo() {
for (int i = 0; i < quantity; i++) {
printf("foo[%i] = %i\n", i, foo[i]);
}
printf("\n");
}
int main() {
quantity = 3;
foo = (int*) malloc(quantity * sizeof(int));
foo[0] = 1;
foo[1] = 2;
foo[2] = 3;
debugFoo();
add(20);
debugFoo();
add(2);
debugFoo();
return 0;
}
は、しかし、私は次の出力を得る:私はmalloc
を持つ配列を作成し、ここで1によって配列のサイズを増加させ、私のadd
機能を呼び出すコードです
ご覧のとおり、add
を呼び出すと、foo [3]の値が1だけインクリメントされます。奇妙なことは、最初の値がadd
に渡された場合にのみインクリメントされることです。 add(21)
にライン30を変更し、私は次のような出力が得られます。
[...]
foo[2] = 3
foo[3] = 21
foo[0] = 1
foo[1] = 2
foo[2] = 3
foo[3] = 21
foo[4] = 2
が、これはバグですか、私はrealloc
間違って使用していますか?
malloc結果をキャストする必要はありません。 – sjsam
[コンパイラのバグ](http://c2.com/cgi)を変更することができます。これは、foo =(int *)malloc(quantity * sizeof(int));/wiki?CompilerBug) –