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... */ };

?


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

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.


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.