2010-12-09 4 views
3

La ligne de code suivante, ce qui crée un tableau de longueur variable sur la pile:Initializing VLA

char name[cpfs_params(cfdata->cpfs)->namemax + 1] = {'\0'}; 

génère les diagnostics du compilateur suivants:

src/mount.cpfs/cpfsfuse.c:179: error: variable-sized object may not be initialized

src/mount.cpfs/cpfsfuse.c:179: warning: excess elements in array initializer

src/mount.cpfs/cpfsfuse.c:179: warning: (near initialization for ‘name’)

Quelles sont les options disponibles pour moi pour initialiser VLA? Suis-je obligé d'utiliser une ligne telle que:

memset(name, 0, sizeof(name)); 

À la place?

Répondre

4

Oui, vous devez écrire le code pour l'initialisation des VLA (qui peut être un memset() comme vous l'avez décrit, ou de toute autre manière que vous voulez).

Il est tout simplement une contrainte dans la norme C (§6.7.8):

  1. The type of the entity to be initialized shall be an array of unknown size or an object type that is not a variable length array type.
+0

Pourquoi je ne peux pas le faire dans la même ligne? –

+0

@Matt Joiner: C'est juste une contrainte de la langue - j'ai ajouté le texte pertinent de la norme à ma réponse. – caf

+1

Je pense que c'est pour éviter les cas de bordure comme ceci: int arr [foo] = {1,2,3}; où foo pourrait être 1 ou 2. Que se passe-t-il alors? : p Et pour le rendre simple {0} est également interdit, mais je ne suis pas sûr. – Maister

Questions connexes