2012-01-08 10 views
2

関数に呼び出すときにバグがありますdynamic_arr - 何とかすべての配列が緩んでいて、返される最初の要素が のみです。私のコードで動的配列関数を呼び出す際のバグ

mainは、動的配列 を作成する必要があり、ユーザーの後、すべての配列が 機能funcdosomthingに渡される必要がある配列の要素を挿入する関数を呼び出します。

しかし、今のところ関数funcdosomthingは、最初の要素だけを取得し、すべての配列を取得しません。私は機能dynamic_arrを使用していないと がint a[] = {1, 0, 2};てmanualyすべてが正常に動作し、機能funcdosomthingは、3つの要素を持つすべての配列を取得し、アレイを設定する場合 -

ちょうど他のすべてが動作することを明らかにします。

は、ここに私のコードです:

int *dynamic_arr(int n) 
{ 
    int i, *a; 
    a = (int*)calloc(n, sizeof(int)); 
    for(i=0;i<n;i++) scanf("%d",a+i); 
    return a; 
} 

int mainprograma() 
{ 
    int n,*a,i; 

    scanf("%d",&n); 
    a=dynamic_arr(n); 

    funcdosomthing(a, sizeof a/sizeof a[0]); 
    ... 

答えて

8

あなたは、動的配列へのポインタから配列のサイズを計算しようとしています。

sizeof a/sizeof a[0] 

Cでは、配列へのポインタしかない場合は、配列の長さを見つけることができません。 の配列がの場合、使用するコードは適切ですが、配列がない場合は、ポインタがあります。あなたはa

int a[3]; 

またはこの

このような
int a[] = {0, 1, 2}; 

を宣言した場合

ので、その後、a配列ではなくポインタだろうと上記のsizeofのコードは次のようになります適用可能です。

幸いにも、作成したばかりのダイナミックアレイの大きさは分かります。それはn要素を持っています。ですから、このようなfuncdosomthingにお電話を記述する必要があります。

funcdosomthing(a, n); 
0

あなたはすでにサイズを知っているときのサイズを探してみるのはなぜ?

sizeof a/sizeof a[0]のようにサイズを計算する代わりに、nを使用する必要があります。さらにsizeof(a)は、aが配列の場合に期待される結果が得られます。この場合、それはpointer-to-memory-which-can-store-n-integersです。

関連する問題