2016-10-31 1 views
1

J'apprends le C et certaines choses me déroutent et les livres que j'ai lus n'ont pas vraiment aidé à clarifier le problème que j'ai.Utiliser la liste d'initialisation en C après la déclaration

Voici donc le code que j'ai:

#include <stdio.h> 
#include <stdlib.h> 

#define ARRAY_SIZE 5 

// gcc -std=c99 stackoverflow-example.c 

int main() { 

    // declare variable array1 
    int array1[ARRAY_SIZE]; 
    // declare and init variable array2 
    int array2[ARRAY_SIZE] = {}; // for integers, the default value is 0 

    // not initialized 
    for (int i = 0; i < ARRAY_SIZE; i++) { 
     // can be anything, not guaranteed to be 0 
     printf("array1[%d]: %d\n", i, array1[i]); 
    } 

    // initialized with initialization list 
    for (int i = 0; i < ARRAY_SIZE; i++) { 
     // element == 0 
     printf("array2[%d]: %d\n", i, array2[i]); 
    } 

    // This is the part that confuses me. 
    // array1 = {}; // error: expected expression before ‘{’ token 
    // array1[] = {}; // same error 

    return EXIT_SUCCESS; 
} 

Yat-il un moyen pratique pour initialiser ce tableau après sa déclaration? Ou la seule façon de mettre chaque élément array1 est une boucle, .: par exemple

for (int i = 0; i < ARRAY_SIZE; i++) 
    array1[i] = 0; 

// initialized with a for loop 
for (int i = 0; i < ARRAY_SIZE; i++) 
    // now it's guaranteed to be 0 
    printf("array1[%d]: %d\n", i, array1[i]); 

Je vous remercie de votre aide. Je sais que c'est un peu une question de noob, mais il est venu comme j'essayais de devenir plus à l'aise avec le langage C et essayé un code non-livre-exemple.

Si vous soupçonnez qu'il y a peut-être quelque chose de fondamental que je n'ai pas reçu, faites le moi savoir, je lirai à ce sujet.

+0

Je pense que vous devriez essayer la fonction 'memset'. Il est optimisé pour initialiser des blocs de données avec une valeur constante. – Milack27

+0

Ok, merci. Cependant, cela ne fonctionne que pour l'initialisation avec 0 (sachez que j'ai utilisé 0 tableau initialisé dans mon exemple, donc cela fonctionnerait réellement). et -1 [(et ce n'est pas vraiment garanti)] (http://stackoverflow.com/a/7202857/4541492). Merci, néanmoins. –

+0

Oh, mon mauvais. Vous avez raison, 'memset' est spécifique aux tableaux d'octets. – Milack27

Répondre

1

Techniquement parlant, initialization peut être effectué une seule fois et seulement au moment de la déclaration, toute valeur stockant après l'affectation ou la copie.

Une liste d'initialisation accolée à des accolades peut être utilisée pour l'initialisation de tableaux uniquement au moment de la déclaration.

Pour un élément individuel d'un tableau, (un élément scalaire), la règle est: (citant C11, chapitre §6.7.9)

Le initialiseur pour un scalaire est une expression unique , éventuellement inclus dans des accolades.

et une liste vide {} est pas un initialiseur valide (d'expression) pour un scalaire. d'où vous avez l'erreur.

Ainsi, pour un tableau déjà défini, la re-réglage doit être fait soit

  • membre par membre, par une boucle
  • utilisant memcpy() ou memset si le permet.
+0

Alors laissez-moi reformuler: Y at-il un moyen (un peu comme un "sucre syntaxique", même si je sais que ce n'est pas ce dont C est célèbre) pour * assigner * divers éléments d'un tableau après déclaration? –

+0

@VinceVarga bien, memset() peut être votre ami, mais pas pour des valeurs différentes, je le crains. –

+0

'memset()' mettra tous les octets à la même valeur, ce qui n'est probablement pas très utile si vous voulez définir des éléments entiers à la même valeur non nulle.Vous pouvez généralement vous en tirer en utilisant 'memset()' pour mettre tous les éléments à un entier '0', mais à proprement parler, ce n'est pas portable. Pour définir des éléments à la même valeur non nulle, une boucle est probablement votre meilleur pari. Pour définir des éléments à différentes valeurs, cela peut être fait avec des assignations individuelles, ou en utilisant 'memcpy()' pour copier tout à partir d'un autre tableau (éventuellement 'const'). –