Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Declaration tableau

13 réponses
Avatar
Francois Cartegnie
Quel est l'intêret de déclarer un tableau de cette manière:

struct a {
struct tc_u32_key keys[0];
...
}

plutot que:

struct a {
struct tc_u32_key *keys;
...
}

J'ai vu pas mal de fois ca dans du code, et lors de la libération de
mémoire, le free est effectué sur la structure a et non explicitement
auparavant sur les éléménts du tableau de la sous-structure.

10 réponses

1 2
Avatar
Vincent Lefevre
Dans l'article ,
Emmanuel Delahaye écrit:

In 'fr.comp.lang.c', Francois Cartegnie wrote:

Quel est l'intêret de déclarer un tableau de cette manière:

struct a {
struct tc_u32_key keys[0];


On ne peut pas faire ça en C standard C90, mais c'est permis en C99.


Ah bon? Citation?

--
Vincent Lefèvre - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


Avatar
Gabriel Dos Reis
Vincent Lefevre <vincent+ writes:

| Dans l'article <bgt5jm$jev$,
| Francois Cartegnie écrit:
|
| > Quel est l'intêret de déclarer un tableau de cette manière:
|
| > struct a {
| > struct tc_u32_key keys[0];
| > ...
| > }
|
| J'ai l'impression que ce n'est pas correct:

Yep. Par contre, GNU C autorise cette extension -- je ne sais pas si
GNU C l'a piquée quelque part ou si c'est son invention.

-- Gaby
Avatar
Francois Cartegnie

On ne peut pas faire ça en C standard C90, mais c'est permis en C99.

'tc_u32_key' n'est pas un type standard.


...



Huh! Ca m'étonnerait qu'il y ait quelque chose après.


Oui, c'est plutot avant qu'il y a d'autres champs.


Je veux définir un tableau dynamique de 128 bytes, dont l'entête sera :

- un entier indiquand la taille utile du tableau

typedef struct
{
size_t size,
char tab[1]; /* C90 */
}
tab_s;


Pour créer le tableau, je fais ça :

tab_s *tab = tab_create(128);

avec

tab_s *tab_create (size_t size)
{
tab_s *this = malloc (sizeof *this - sizeof this->tab + size);

if (this)
{
this->size = size;
memset (this->tab, 0, this->size);
}
return tab;
}


Mais comment est faite la déallocation ? On doit toujours libèrer le
tableau avec free(tab->tab)
ou le simple free(tab) suffit car le compilateur sait que c'est un
tableau de taille 0 modifié en taille n ?


Avatar
Francois Cartegnie
Vincent Lefevre wrote:
Dans l'article ,
Emmanuel Delahaye écrit:


In 'fr.comp.lang.c', Francois Cartegnie wrote:



Quel est l'intêret de déclarer un tableau de cette manière:

struct a {
struct tc_u32_key keys[0];




On ne peut pas faire ça en C standard C90, mais c'est permis en C99.



Ah bon? Citation?



Houlà, je pose plus de questions ici moi si les threads partent en
couille a chaque fois :)



Avatar
Francois Cartegnie
Gabriel Dos Reis wrote:
Vincent Lefevre <vincent+ writes:

| Dans l'article <bgt5jm$jev$,
| Francois Cartegnie écrit:
|
| > Quel est l'intêret de déclarer un tableau de cette manière:
|
| > struct a {
| > struct tc_u32_key keys[0];
| > ...
| > }
|
| J'ai l'impression que ce n'est pas correct:

Yep. Par contre, GNU C autorise cette extension -- je ne sais pas si
GNU C l'a piquée quelque part ou si c'est son invention.


Ca vient du noyau linux, donc GNU compilé avec un compilateur GNU
(gcc)... Donc c'est pas forcément portable ailleurs.

Avatar
Yves Kuhry
Emmanuel Delahaye wrote:

Le 'truc' du tableau de 0 (C99) ou 1 (C90), permet de définir une
structure linéaire dont le début est défini par la structure, et la suite
par un tableau.



Juste pour savoir, qu'appelles tu structure "linéaire" ?

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Francois Cartegnie wrote:

On ne peut pas faire ça en C standard C90, mais c'est permis en C99.


Ah bon? Citation?


Houlà, je pose plus de questions ici moi si les threads partent en
couille a chaque fois :)


Toute discussion est interdite? Tout doit être propre et lisse? La vraie vie
n'est pas comme ça, et heureusement.

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/



Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Vincent Lefevre <vincent+ wrote:

struct a {
struct tc_u32_key keys[0];


On ne peut pas faire ça en C standard C90, mais c'est permis en C99.


Ah bon? Citation?


6.7.5.2 Array declarators
Constraints
1 The [ and ] may delimit an expression or *. If [ and ] delimit an
expression (which specifies the size of an array), it shall have an
integer type. If the expression is a constant expression then it shall
have a value greater than zero. The element type shall not be an
incomplete or function type.

Effectivement, dans N869 (C9x), c'est pas permis. Peut être un changement de
dernière minute dans C99?

Il m'a semblé lire ça sur clc, comme étant un 'entérinement' de la pratique
du tab[1] en fin de structure...

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/



Avatar
Yves Kuhry
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', Yves Kuhry wrote:

Juste pour savoir, qu'appelles tu structure "linéaire" ?


Touts les élements sont consécutifs. Dès qu'il y a un pointeur, c'est plus
linéaire.

ok, merci



Avatar
Vincent Lefevre
Dans l'article ,
Emmanuel Delahaye écrit:

Effectivement, dans N869 (C9x), c'est pas permis. Peut être un
changement de dernière minute dans C99?


J'aimerais bien voir une citation de C99.

Il m'a semblé lire ça sur clc, comme étant un 'entérinement' de la
pratique du tab[1] en fin de structure...


Je ne croirais pas tout ce qu'on peut lire sur clc...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/> - 100%
validated (X)HTML - Acorn Risc PC, Yellow Pig 17, Championnat International
des Jeux Mathématiques et Logiques, TETRHEX, etc.
Work: CR INRIA - computer arithmetic / SPACES project at LORIA

1 2