2016-07-28 16 views
-1

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間違って使用していますか?

+0

malloc結果をキャストする必要はありません。 – sjsam

+0

[コンパイラのバグ](http://c2.com/cgi)を変更することができます。これは、foo =(int *)malloc(quantity * sizeof(int));/wiki?CompilerBug) –

答えて

5

sizeof(foo)int*であり、割り当てられたバッファのサイズが、fooの大きさではありません。新しいバッファサイズを計算するには、保存された要素の数を使用します。

foo = (int*) realloc(foo, sizeof(int) * (quantity + 1)); 
+0

[同じアイデア](http://ideone.com/8VwKoX) – imbearr

1

sizeof(foo)は、現在のサイズを格納しているあなたは、「正しく」(quantity)グローバルスコープの変数を宣言している、おそらく4.ため、sizeof演算子の同じ値は、あなたにint *

のサイズを返して、常にあなたを返しますあなたの配列は、mallocのように、その変数をreallocの構造体に使用します。

void add(int number) { 
    quantity++; 
    foo = realloc(foo, (quantity * sizeof(int))); 
    if (foo != NULL) 
    { 
     foo[quantity-1] = number; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to add number.\n"); 
    } 
} 

常に関数の戻り値をチェックすることは非常に重要です。 戻り値がreallocの私の例に示されているように、main関数のmallocに対して同じことをしなければなりません。

int main() { 
    quantity = 3; 
    foo = malloc(quantity * sizeof(int)); 
    if (foo != NULL) 
    { 
     foo[0] = 1; 
     foo[1] = 2; 
     foo[2] = 3; 

     debugFoo(); 

     add(20); 
     debugFoo(); 
     add(2); 
     debugFoo(); 

     return 0; 
    } 
    else 
    { 
     fprintf(stderr, "Failed to allocate array.\n"); 
     return 1; 
    } 
} 
+0

このコードにはバグが含まれています。 - 修正されたようです。 – MikeCAT

+0

だから私は編集中です。私は呼吸をさせてもらえますか? – LPs

+0

@MikeCAT私はひどく "あなたの回答を投稿"ボタンを押しました... :) – LPs

関連する問題