Comment initialiser le tableau à 0 en C?

170

J'ai besoin d'un grand tableau nul en C en tant que global. Existe-t-il un moyen de le faire en plus de taper

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?

Claudiu
la source
26
char ZEROARRAY [1024] = {0};
3
Si jamais vous avez besoin d'allouer de la mémoire sur le tas, vous pouvez également utiliser calloc (). Par exemple char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu
2
NB calloc est très bien pour charetc, mais si vous voulez un tableau de pointeurs, vous devez les définir explicitement sur NULL, il n'y a (absurdement!) Aucune garantie que NULL est représenté comme zéro octet. Ceci même si le littéral 0représente implicitement le pointeur nul.
Adrian Ratnapala
Double

Réponses:

284

Les variables globales et les variables statiques sont automatiquement initialisées à zéro. Si vous avez simplement

char ZEROARRAY[1024];

à portée globale, ce sera tous des zéros à l'exécution. Mais en fait, il existe une syntaxe abrégée si vous aviez un tableau local. Si un tableau est partiellement initialisé, les éléments non initialisés reçoivent la valeur 0 du type approprié. Vous pourriez écrire:

char ZEROARRAY[1024] = {0};

Le compilateur remplirait les entrées non écrites avec des zéros. Vous pouvez également utiliser memsetpour initialiser le tableau au démarrage du programme:

memset(ZEROARRAY, 0, 1024);

Cela serait utile si vous l'aviez modifié et que vous vouliez le réinitialiser à tous les zéros.

John Kugelman
la source
2
{0}; fonctionne bien, C99 [$ 6.7.8 / 21] S'il y a moins d'initialiseurs dans une liste entre accolades qu'il n'y a d'éléments ou de membres d'un agrégat, ou moins de caractères dans une chaîne littérale utilisée pour initialiser un tableau de taille connue qu'il n'y en a éléments du tableau, le reste de l'agrégat doit être initialisé implicitement de la même manière que les objets qui ont une durée de stockage statique
Sasha Zezulinsky
Veuillez vous référer à: Le 0 initialisé n'est pas un character. c'est un integer.
Yonggoo Noh
1
{}discussion: stackoverflow.com/questions/17589533/... memset n'est évidemment pas correcte: je pense que cela ne fonctionne que pour 0: stackoverflow.com/questions/11138188/...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
S'il s'agit d'un tableau de structures, et en utilisant -Werror=missing-bracesdans gcc, il doit être initialisé à {{0}}. Si le premier élément struct est un autre struct alors {{{0}}}et ainsi de suite. Voir stackoverflow.com/questions/5434865/…
Tor Klingberg
1
Aujourd'hui, j'ai rencontré l'étrange ... int arr[256]={1,2,7,{0}};... qui m'a amené ici. Je ne savais même pas que cette mise à zéro partielle était une chose jusqu'à ce que je la voie.
Neil Gatenby
32

Si vous souhaitez initialiser le tableau avec des valeurs autres que 0, gccvous pouvez faire:

int array[1024] = { [ 0 ... 1023 ] = -1 };

Il s'agit d'une extension GNU des initialiseurs désignés C99 . Dans les anciens GCC, vous devrez peut-être utiliser -std=gnu99pour compiler votre code.

Deqing
la source
14
Les initialiseurs désignés sont standard dans C99. L'utilisation de ...pour désigner une plage est une extension spécifique à gcc.
Keith Thompson
1
Ce n'est pas un initialiseur désigné par C99, c'est un initialiseur de plage spécifique à GCC . Pourquoi consulter le manuel GCC au lieu de la norme C99?
Craig Barnes