it-swarm.com.de

c Zeiger auf ein Array von Strukturen

Ich weiß, dass diese Frage viel gestellt wurde, aber ich bin immer noch unklar, wie man auf die Strukturen zugreift.

Ich möchte einen globalen Zeiger auf ein Array von Strukturen setzen:

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;
}

Aber es gibt mir Warnungen. Wie soll ich mit [] auf die spezifischen Strukturen zugreifen?

Wie sollte ich ein Array von Zeigern vom Strukturtyp erstellen? test_t *_array_ptr[2];?

15
user1539348

Die gesuchte Syntax ist etwas umständlich, sieht aber so aus:

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

Sie können es dann so verwenden:

test_array_ptr = &array_t1;
(*test_array_ptr)[0] = new_struct;

Um die Syntax verständlicher zu machen, können Sie eine typedef verwenden:

// 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;

Das Dienstprogramm cdecl ist nützlich zum Entschlüsseln komplexer C-Deklarationen, insbesondere wenn Arrays und Funktionszeiger beteiligt sind.

16
Adam Rosenfield

test_t * test_array_ptr ist ein Zeiger auf test_t. Es könnte sich um einen Zeiger auf eine einzelne Instanz von test_t handeln, aber es könnte sich um einen Zeiger auf das erste Element eines Arrays von Instanzen von test_t handeln:

test_t array1[1024];

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

dadurch wird myArray auf das erste Element von array1 verweisen. Mit der Zeigerarithmetik können Sie diesen Zeiger auch als Array behandeln. Nun können Sie auf das zweite Element von array1 wie folgt zugreifen: myArray[1], das gleich *(myArray + 1) ist.

Was ich jedoch verstehe, wollen Sie hier eigentlich einen Zeiger auf test_t angeben, der ein Array von Zeigern auf Arrays darstellt:

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];
4
LihO

Das Problem, das Sie haben, ist, dass Sie (*test_array_pointer) verwenden, das das erste Element des Arrays ist. Wenn Sie ein bestimmtes Element des Arrays zuweisen möchten, führen Sie folgende Schritte aus:.

function foo()
{
    test_array_ptr = array_t1;

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

wenn Sie immer dem ersten Element des Arrays zuordnen möchten, können Sie dies tun ...

function foo()
{
    test_array_ptr = array_t1;

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

und wurde von anderen auf mich aufmerksam gemacht, und etwas, das ich ganz vergessen hatte, weil ich es nicht für immer benutzt hatte, kann eine einfache Zuordnung einfacher Strukturen in C ...

function foo()
{
    test_array_ptr = array_t1;

    test_t new_struct = {0,0};
    test_array_ptr[0] = new_struct;
}
0
K Scott Piel

Ich würde einen Zeiger auf einen Zeiger verwenden:

test_t array_t1[1024];
test_t **ptr;
ptr = array_t1;
ptr[0] = ...;
ptr[1] = ...;
etc.
0
Sheldon Juncker