2013-04-24 8 views
11

私はこの質問がたくさん頼まれていることを知っていますが、構造体にアクセスする方法はまだ不明です。c structの配列へのポインタ

私は、構造体の配列へのグローバルポインタ作りたい:

typdef struct test 
{ 
    int obj1; 
    int obj2; 
} test_t; 

extern test_t array_t1[1024]; 
extern test_t array_t2[1024]; 
extern test_t array_t3[1025]; 

extern test_t *test_array_ptr; 

int main(void) 
{ 
    test_array_ptr = array_t1; 

    test_t new_struct = {0, 0}; 
    (*test_array_ptr)[0] = new_struct; 
} 

をしかし、それは私に警告を与えます。 []で特定の構造体にアクセスするにはどうすればよいですか?

同様に、構造体タイプのポインタの配列を作成するにはどうすればよいですか? test_t *_array_ptr[2];

+1

、エラーを与える必要があります。 '(* test_array_ptr)[0]' dereferencesは2回ですが、星は1つだけです。 –

+0

@DanielFischer:gccは、たとえば、 "制約違反"(Cが何かが*違法であると言っているほど近い)のコンストラクトに対して、警告を頻繁に表示します。 '-pedantic-errors'オプションはより厳密に動作します。 –

+0

@KeithThompsonはい、その特定の問題については、gccは 'deref.c:18:18:error:添え字付きの値は配列もポインタもベクトルでもありません 'と言っています。 (Hmm、 'ベクトル'は何ですか?これはCですか?)構造体をデリファレンスする、または 'int'のメンバにアクセスするようなものについては、コンパイラはどのようにそれを行うべきなのかわからないので、あきらめてエラー。 –

答えて

14

あなたが探している構文は次のとおりです。やや面倒が、それは次のようになります。

// Declare test_array_ptr as pointer to array of test_t 
test_t (*test_array_ptr)[]; 

あなたがそのようにようにそれを使用することができます:

test_array_ptr = &array_t1; 
(*test_array_ptr)[0] = new_struct; 
をあなたが typedefを使用することができ、理解する構文を容易にするために

// Declare test_array as typedef of "array of test_t" 
typedef test_t test_array[]; 
... 
// Declare test_array_ptr as pointer to test_array 
test_array *test_array_ptr = &array_t1; 
(*test_array_ptr)[0] = new_struct; 

cdeclユーティリティは、配列や関数ポインタが巻き込まれる場合は特に、複雑なCの宣言を解読するのに便利です。

+0

おかげさまで、ありがとうございました!最初の答えとの違いは何ですか?関数foo() { test_array_ptr = array_t1; test_t new_struct = {0,0}; test_array_ptr [0] = new_struct; } – user1539348

0

問題は、配列の最初の要素である(*test_array_pointer)を取っていることです。あなたは、配列の特定の要素に割り当てる場合は、次の操作を行います...

function foo() 
{ 
    test_array_ptr = array_t1; 

    test_t new_struct = {0,0}; 
    memcpy(&test_array_ptr[0], &new_struct, sizeof(struct test_t)); 
} 

あなたは常に配列の最初の要素に割り当てたい場合は、これを行うことができます...

function foo() 
{ 
    test_array_ptr = array_t1; 

    test_t new_struct = {0,0}; 
    memcpy(test_array_ptr, &new_struct, sizeof(struct test_t)); 
} 

と他の人が私に指摘されている、と私は正直に完全に永遠のよりよい部分でそれを使用していないたために忘れていた何か、あなたがC言語で簡単な構造の直接の割り当てを行うことができます...

function foo() 
{ 
    test_array_ptr = array_t1; 

    test_t new_struct = {0,0}; 
    test_array_ptr[0] = new_struct; 
} 
+1

私はかなり単純に '='を使って構造体(構造体へのポインタではない)をコピーできることを確信しています。 –

+1

はい、できます。これは、例えば単純な代入で配列をコピーし、 'struct'でそれらをラップする方法の1つです。 –

+0

ええと...それは骨になっていました...何十年も私は何も使っておらず、あなたも忘れていました。修正しました。 –

4

test_t * test_array_ptrtest_tへのポインタです。これはtest_tの単一のインスタンスへのポインタであってもよいが、それはtest_tのインスタンスの配列の最初の要素へのポインタとすることができる:これはarray1の最初の要素にmyArrayポイントを行い、ポインタ演算が可能

test_t array1[1024]; 

test_t *myArray; 
myArray= &array1[0]; 

このポインタを配列としても扱います。今度はarray1の2番目の要素、myArray[1]のような*(myArray + 1)にアクセスできます。

しかし、私が理解から、あなたが実際にここでやりたいことは配列へのポインタの配列を表しますそのtest_tへのポインタへのポインタを宣言することです:

test_t array1[1024]; 
test_t array2[1024]; 
test_t array3[1025]; 

test_t **arrayPtr; 
arrayPtr = malloc(3 * sizeof(test_t*)); // array of 3 pointers 
arrayPtr[0] = &array1[0]; 
arrayPtr[1] = &array2[0]; 
arrayPtr[2] = &array3[0]; 
+0

どのように私は一度に単一の配列構造体へのポインタを作成するのですか?配列内の構造体にはどうすればアクセスできますか? – user1539348

+0

@ user1539348:今すぐ私の答えをチェックしてください:) – LihO

0

私は次のようにポインタへのポインタを使用します。あなたに警告を与えるべきではありません

test_t array_t1[1024]; 
test_t **ptr; 
ptr = array_t1; 
ptr[0] = ...; 
ptr[1] = ...; 
etc. 
関連する問題