#include <stdio.h>
int main()
{
int a[0],b[4][0];
printf("%d %d ",sizeof(a),sizeof(b));
}
//output
0 0
what is the significance of a[0] , why also 2d array of size 0 is allowed?
3 Réponses :
ni c ni c ++ n'autorise des tableaux de longueur zéro, votre programme est donc mal formé. P>
(E.g. C ++ 11, 8.3.4 / 1: "[La taille de la matrice] doit être supérieure à zéro".) P>
(comme un point de justification: un tableau de longueur zéro serait délicat et déroutant de se réconcilier avec l'exigence que chaque objet a une adresse unique.) P>
Comme @SIDYLL indique que les tableaux de longueur zéro sont disponibles en tant que extension dans GCC . p>
Ce n'est pas une erreur dans le compilateur GCC Ubuntu 10.04
@ user1044137: Il existe de nombreuses façons de rédiger de nombreuses façons d'écrire des programmes C et C ++ qui sont mal formés et pour lesquels vous ne recevez aucun diagnostic. Pour cette affaire, mon GCC dit Avertissement: ISO C ++ interdit la matrice de taille zéro code>. Vous devriez toujours activer tous les avertissements.
Pourquoi compilez-vous un programme C B> à partir d'une question C B> avec un compilateur C ++ B> Compiler et de l'affichage A C ++ B> Extrait standard?
@sidyll: ceci utilisé pour être étiqueté C ++; Vérifiez le journal d'édition.
@SIDYLL: GCC dit également Avertissement: ISO C interdit la matrice de taille zéro code> pour les trois versions de C.
Je sais que c'était C ++, mais l'utilisation incorrecte de cette langue sale pour faire référence à C me fait "un de ces jours où je vais te couper en petits morceaux, C ++". Oh mec, cela me rend fou. D'accord désolé. Retour à l'entreprise: assez étrangement, je n'ai reçu aucun avertissement, ni à Clang ni GCC
@sidyll: Vous avez besoin de l'option -pedantic code> pour activer les contrôles de conformité stricts. Pour les nouveaux projets, je recommanderais -w -wall -wextra -write -wrings -wrings -pedantic code>; Probablement orné de -std = c99 code>. Idem pour C ++, mais sans les "chaînes d'écriture" (qui est automatique).
Ah, bien sûr. C'est ça. Merci pour l'information Kerrek!
Je recommanderais un peu -wno -... code> options après -wall -wextra code>. GCC inclut des éléments absurdes qui déclenchent de manière virtuelle tout le temps sur les programmes corrects et vous oblige même à faire frémir les meilleures pratiques dans certains cas si vous souhaitez fermer les avertissements (par exemple, vous ne pouvez pas utiliser l'initialiseur zéro universel pour les types opaques, {0} code>).
Vous trouverez votre réponse dans Le manuel de la GCC
Si vous utilisez C99 P>
- Les membres de la matrice flexibles sont écrits comme des contenus [] sans 0. li>
- Les membres flexibles des matrices ont un type incomplet, et la taille de la taille de l'opérateur peut ne pas être appliquée. En tant qu'appariement de la mise en oeuvre d'origine des tableaux de longueur zéro, Taillefe évalue à zéro. Li>
- Les membres de la matrice flexibles ne peuvent apparaître que comme dernier membre d'une structure qui est par ailleurs non vide. Li>
- Une structure contenant un organe flexible, ou une union contenant une telle structure (éventuellement récursivement), peut ne pas être un élément d'une structure ou d'un élément d'une matrice. (Cependant, ces utilisations sont autorisées par GCC comme extensions. Li> ul> blockquote>
et bien sûr, comment ils peuvent être utiles: p>
Les matrices de longueur zéro sont autorisées dans GNU C. Ils sont très utiles comme le dernier élément d'une structure qui est vraiment un en-tête pour un objet de longueur variable: P>
struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length;
En C11 et en C99, Tailleof code> n'est pas toujours un opérateur de compilation (c'était uniquement en C89).
Il n'y a pas beaucoup d'usage comme indiqué dans votre exemple, mais des tableaux de taille zéro ont été fréquemment utilisés dans des structures où le dernier élément a été dimensionné de manière dynamique: L'utilisation d'une matrice de longueur zéro est : p> 1) Malheureusement, certains compilateurs (MSC) lanceraient un ajustement de sifflement sur une telle construction et forcerait une reformulation de moindre, apaisante et techniquement incorrecte: p> < PRE> XXX PRE> Pensez à une matrice de taille zéro comme un espace réservé. Il y a peu de besoin de faire cela plus, à moins que vous ne soyez obligé d'utiliser variables_elements code> a une adresse (malgré la réponse de quelqu'un)
2) il a aussi une array sémantique
3) Calculer la taille dynamique de la matrice est simplifié p> C code>, ce qui est le cas sur de nombreux environnements intégrés. P> P>