2010-04-28 3 views
3

Qu'est-ce qu'un tableau flexible, exactement? Je ne trouve pas grand-chose dessus.Qu'est-ce qu'un tableau flexible?

+0

Problème de langue-agnostique, en essayant de comprendre les différences entre les tableaux statiques/dynamiques/flexibles. –

+0

@ rlb.usa - Les tableaux "flexibles" n'existent pas, mais un "membre flexible du tableau" est très spécifique à C (et C++ mais personne ne l'utilise ici). –

+0

Veuillez fournir un lien ou un devis ou une référence. –

Répondre

2

Un tableau flexible est un tableau dont les limites d'index sont déterminées au moment de l'exécution et peuvent changer pendant la durée de vie du tableau.

Les tableaux Java sont flexibles. Par exemple, en Java, vous pouvez assigner un tableau à un autre:

int[] a1 = {1, 2, 3, 4}; 
int[] a2 = {1, 2, 3}; 
a1 = a2; 

Dans un premier temps, a1 a une portée d'index 0-3, et a2 a indice de plage 0-2. Après l'affectation a1 = a2, a1 pointe vers un tableau avec la plage d'index 0-2, donc la plage d'index de a1 a varié pendant la durée de vie de a1.

3

Il n'existe pas de réseau flexible, mais un élément de réseau flexible existe. Il est utilisé pour fournir un accès à des données de longueur variable en tant que membre d'une structure.

De http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/strct.htm:

Un élément de réseau flexible, qui est une caractéristique C99 , peut être un élément d'une structure avec plus d'un élément nommé . Un membre de groupe flexible peut être utilisé pour accéder à un objet de longueur variable . L'élément de matrice flexible doit être le dernier élément d'une telle structure et il a un type incomplet.

8

Il y a deux choses, il pourrait se référer. Le seul endroit que j'ai vu que précis libellé utilisé beaucoup est C99 cependant.

Un membre de tableau flexible est le nom officiel de C99 pour ce que l'on appelle (habituellement) le "struct hack". L'idée de base est que vous définissez une structure comme ceci:

struct x { 
    int a; // whatever members you want here. 
    size_t size; 
    int x[]; // no size, last member only 
}; 

Ceci est principalement utilisé (ou exclusivement) avec l'allocation dynamique. Lorsque vous souhaitez allouer un objet de ce type, vous allouez assez d'espace pour quelque taille du tableau dont vous avez besoin:

struct x *a = malloc(sizeof(struct x) + 20 * sizeof(int)); 
a->size = 20; 

Le membre size n'est pas strictement nécessaire, mais souvent à portée de main pour garder la trace de la taille allouée pour un article. Celui ci-dessus a de l'espace pour 20 int, mais le point principal de ceci est que vous pourriez avoir plusieurs autour, chacun avec sa propre taille.

+0

Doit cacher probablement l'appel complexe 'malloc()' derrière une fonction: 'struct x * struct_x_alloc (taille_t s) {struct x * t = malloc (taille de t + s * sizeof (int)); t-> taille = s; retour t; } ' –

+0

@Chris: oui, mais n'allez pas trop loin pour que tout soit gérable, sinon les gens commenceront à le confondre avec le C++. ;-) –

+1

@Chris: votre calcul de taille est faux - il devrait lire 'sizeof * t + ...'; au lieu de 'sizeof (int)', vous pouvez également utiliser 'sizeof * t-> x' – Christoph

0

Les éléments de matrice flexibles sont des outils indispensables dans la programmation réseau. En programmation réseau, vous ne connaissez jamais la taille des données à l'avance.

Par exemple, vous écrivez un code pour fournir l'intégralité de TABLE DE ROUTAGE pour certaines raisons. Vous ne savez jamais combien de routes sont disponibles à l'avance et l'allocation maximale supportée entravera gravement votre code. Le pari le plus sûr est de déclarer le membre flexible du tableau et de faire cuire toutes vos données et de les déclencher une fois.