web-dev-qa-db-fra.com

c pointeur vers un tableau de structures

Je sais que cette question a été beaucoup posée, mais je ne sais toujours pas comment accéder aux structures.

Je veux faire un pointeur global vers un tableau de structs:

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

Mais cela me donne des avertissements. Comment dois-je accéder aux structures spécifiques avec []?

De même, comment dois-je créer un tableau de pointeurs de type struct? test_t *_array_ptr[2];?

15
user1539348

La syntaxe que vous recherchez est un peu lourde, mais elle ressemble à ceci:

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

Vous pouvez ensuite l'utiliser comme ceci:

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

Pour faciliter la compréhension de la syntaxe, vous pouvez utiliser un 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;

L'utilitaire -cdecl est utile pour déchiffrer des déclarations C complexes, en particulier lorsque des tableaux et des pointeurs de fonction sont impliqués.

16
Adam Rosenfield

test_t * test_array_ptr est un pointeur sur test_t. Ce pourrait être un pointeur sur une instance unique de test_t, mais ce pourrait être un pointeur sur le premier élément d'un tableau d'instances de test_t:

test_t array1[1024];

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

ceci fait que myArray pointe sur le premier élément de array1 et que l'arithmétique de pointeur vous permet de traiter également ce pointeur comme un tableau. Vous pouvez maintenant accéder au 2e élément de array1 comme ceci: myArray[1], qui est égal à *(myArray + 1).

Mais de ce que je comprends, ce que vous voulez réellement faire ici est de déclarer un pointeur sur lequel indiquer test_t qui représentera un tableau de pointeurs sur des tableaux:

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

Le problème que vous avez est que vous prenez (*test_array_pointer) qui est le premier élément du tableau. Si vous souhaitez affecter un élément spécifique du tableau, procédez comme suit ...

function foo()
{
    test_array_ptr = array_t1;

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

si vous voulez toujours assigner au premier élément du tableau, vous pouvez le faire ...

function foo()
{
    test_array_ptr = array_t1;

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

et a été signalé à moi par d'autres, et quelque chose que j'avais honnêtement complètement oublié de ne pas l'avoir utilisé dans la meilleure partie de toujours, vous pouvez faire l'affectation directe de structures simples en C ...

function foo()
{
    test_array_ptr = array_t1;

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

Je voudrais utiliser un pointeur vers un pointeur comme:

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