0
votes

Comment statique initialise un tableau 2D à un pointeur aux pointeurs?

J'ai une structure, disons foo code> qui ressemble à ceci, xxx pré>

Il existe d'autres membres de la structure qu'ils ne sont pas importants pour la question. Maintenant, je veux statique initialiser la structure. P>

/* Variation 1 */   .point=(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}
/* Variation 2 */   .point=(size_t**)(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}
/* Variation 3 */   .point=&(size_t[][4]){ {1, 2, 3, 4}, {5, 6, 7, 8}}


3 commentaires

Vous essayez d'obtenir une adresse du comportement temporaire (comportement indéfini) et vous essayez de traiter les pointeurs vers des pointeurs comme des tableaux 2D (dont ils ne sont pas).


@Sergeya obtenir l'adresse peut ne pas être un problème. Les littéraux composés ont une durée de stockage du bloc enfermé et la norme a au moins un exemple d'admission dans ce cas.


@ user694733 Bien que les littéraux composés, la variable temporaire de type FOO créée à partir de celle-ci ne le fait pas.


3 Réponses :


2
votes

Notez que ce n'est pas techniquement une matrice 2D, mais un tableau pointeur à pointeur. Mais comme les littéraux composés ne peuvent pas avoir de type de matrice de longueur variable, et il ne semble pas que vous souhaitiez utiliser des dimensions codées en papier, cela peut être le seul moyen d'aller.

Vous devrez diviser vos tableaux en matrices 1D d'inconnu. Taille et utilisez des littéraux composés séparés pour eux: P>

struct foo * bar = &(struct foo){
    .n = 4,
    .point = (size_t*[]){
        (size_t[]){1, 2, 3, 4}, 
        (size_t[]){5, 6, 7, 8}
    }
};


0 commentaires

1
votes

Tout d'abord Taille_t ** Point Code> est logique que si vous avez l'intention de pointer sur un tableau de Taille_T * Code>. Cela ne semble pas être le cas ici, vous devez donc modifier le type à un tableau 2D ou un pointeur de tableau.

Problème suivant est que c est plutôt encombrant ici - émousseusement mis, vous ne pouvez pas avoir de "statique dynamique", il doit être soit. Vous pouvez soit avoir ceci: p> xxx pré>

ou également peut-être un élément de tableau flexible sous la forme d'un tableau de pointeurs, comme celui-ci: P>

struct foo {
  size_t n;
  size_t* point[];
};

const size_t n = 4;
struct foo* bar = malloc ( sizeof(*bar) + sizeof (size_t*[n]) );
bar->n = n;
bar->point[0] = (size_t []) { 1, 2, ... /* any number of elements*/ };
bar->point[1] = ...
...
bar->point[0][0] = 0; // access element in the lookup-table
...
free(bar);


0 commentaires

0
votes

Afin d'initialiser un pointeur statique, les entités que vous souhaitez avoir besoin d'avoir été déclarées. Seulement dans de rares cas, comme peut-être un système intégré dans lequel vous connaissez l'adresse de quelque chose à l'heure de la compilation, connaîtrez-vous la valeur réelle du pointeur à être initialisée statiquement.

Je vois quelques problèmes avec ce que vous faites: 1) Le compilateur ne peut pas résoudre ce que la valeur de N est à l'époque que vous essayez de l'utiliser pour déclarer la taille de votre matrice. Les tableaux doivent avoir une taille fournie dans leur déclaration, contrairement à C #. 2) Le membre "Point" de la structure est un pointeur des pointeurs, mais vous essayez de l'initialiser avec un tableau de matrices. Si vous souhaitez pointer vers un tableau de tableaux, vous n'avez besoin que de l'adresse de l'élément [0] [0], donc * point non ** point. De là, vous pouvez utiliser une notation de tableau pour accéder aux éléments.

Vous devez faire quelque chose comme ceci: xxx

alors vous pouvez accéder au tableau par: xxx

Si vous avez vraiment besoin de pointeurs sur des pointeurs, les valeurs d'initialisation devront être soit adresses des références (& nom) ou des valeurs qui sont en train de lancer comme des pointeurs, mais je n'ai pas t suggère de faire ça.

Si vous avez vraiment besoin d'une taille de variable pour votre matrice, vous devez également attribuer la mémoire de manière dynamique, puis initialiser le pointeur dans la structure avec l'adresse renvoyée de celle-ci.


0 commentaires