2016-08-10 8 views
0

私はC開発には新しく、関数内で配列値を設定して呼び出しメソッドに戻す際に問題があります。関数自体はintを返す必要があり、配列のサイズは動的でなければならないので、配列へのポインタを利用して元の配列を更新しようとしています。私はこれを実行すると、私は次のような結果が取得Cのポインタを使用して参照によって配列を修正しています

int getArray(TestType *testArray) 
{ 

    testArray = malloc(2 * sizeof(TestType)); 
    testArray[0].id = 1; 
    testArray[0].testFloat = 1.5; 
    testArray[1].id = 2; 
    testArray[1].testFloat = 2.5; 

    printf("getArray element 2 id = %d\n", testArray[1].id); 

    return 1; 
} 

void main() 
{ 
    TestType *testArray; 
    int i = getArray(*&testArray); 
    printf("main element 2 id = %d\n", testArray[1].id); 
} 

getArray element 2 id = 2 
main element 2 id = 0 

私が他の場所で見てきたとc returning an array from a functionは、同様の問題を説明したが、この一方で、char配列を扱っている私のコードは以下の通りです私はユーザー定義の構造体を持っているので、私は同じソリューションを適用することができるとは思わない。

+1

C11ドラフト標準n1570と同じです:6.5.2.2関数呼び出し* 4引数は任意の完全なオブジェクト型の表現かもしれません。ファンクションへのコール の準備では、引数が評価され、各パラメータに対応する引数の の値が割り当てられます。 93)関数はそのパラメータの値を変更することがありますが、これらの変更は 引数の値には影響しません* – EOF

+1

@EOF絶対に正しく、ちょうど私の2セント、私はC開発に新しいです、_only_それらはかなり重い言葉です。 :) –

+1

@SouravGhosh:Cで何が起こっているのかを実際に理解したい場合は、標準を読むことに代わる方法がないことがわかります。標準の多くは、かなり読みやすくなっています。 – EOF

答えて

2

コードでは、testArray自体が値渡しされています。関数内の変更があれば、は呼び出し元にを反映しません。 testArrayのアドレスを渡す必要があります。つまり、ポインタにポインタを使用する必要があります。この状態で

main()

printf("main element 2 id = %d\n", testArray[1].id); 

は基本的にundefined behaviorを呼び出し、無効なメモリにアクセスしています。

ただし、目的の動作を取得するために

int getArray(TestType **testArray) 
{ 

    *testArray = malloc(2 * sizeof(TestType)); 
    (*testArray[0]).id = 1; 
    //.... 
    //.... 

int i = getArray(&testArray); 

ような何かを行うことができます。ただgetArray(*&testArray);に言及すると

は、 getArray(testArray);

+0

値渡しの配列を関数に渡すことはできません(そして、渡し参考はありませんCで)。 – Olaf

+1

ご協力いただきありがとうございます。私はちょうどあなたが示唆した通りにこれを試したところで、 'main()'の出力として0を得ています。 'testArray [1] .id'を別の構文に変更する必要がありますか? – trebor74

+0

実際には、提案されたコードは 'testArray [0] .id'という配列の最初の要素を正しく返します。 2番目の値は0、 'testArray [1] .id'です。 – trebor74

関連する問題