2010-11-27 3 views
12

En C, je sais que je peux faire un tableau comme celui-ciPeut-on (re) définir toutes les valeurs d'un tableau sur une ligne (après son initialisation)?

int myarray[5] = {a,b,c,d,e}; 

Cependant, imaginez le tableau était déjà initialisés comme

int myarray[5]; 

puis à un moment donné après, je voulais mettre/changement toutes les valeurs sans aller

myarray[0] = a; 
myarray[1] = b; 
myarray[2] = c; 
myarray[3] = d; 
myarray[4] = e; 

mais plutôt quelque chose comme

myarray = {a,b,c,d,e}; 

La raison pour laquelle je pose cette question parce que si je déclare mon tableau sur le tas, j'initialiser le tableau comme:

int* myarray = malloc(5*sizeof(int)); 

Je voudrais être en mesure d'entrer dans toutes les valeurs une ligne (principalement pour rendre mon code plus propre)

Répondre

11
memcpy(myarray, (int [5]){a,b,c,d,e}, 5*sizeof(int)); 
+1

Est-ce pas seulement C99? –

+3

Oui. Mais quand quelqu'un donne une réponse C++ en utilisant des modèles, cela nécessite-t-il un commentaire qui nécessite C++ 98? Ou quand j'utilise un prototype de fonction en C, ai-je besoin de mentionner qu'il ne fonctionnera pas dans les implémentations pré-ANSI C? C99 ** est ** le langage C actuel. –

+3

@R .: Malheureusement beaucoup de gens sont coincés avec C89, par ex. Microsoft n'a toujours pas le support C99 dans Visual Studio, et de nombreux étudiants doivent encore utiliser des compilateurs archaïques tels que Turbo C. Il n'est donc probablement pas justifié de supposer que la majorité des gens peuvent utiliser les fonctionnalités spécifiques à C99. –

1

Non, C n'a pas cette fonctionnalité. Si vous définissez tous les éléments du tableau sur la même valeur, utilisez memset(3).

+5

Cette réponse peut être trompeur. 'memset' n'attribue pas de" éléments de tableau "à une valeur. Il affecte * octets * dans un bloc de mémoire à une valeur spécifique. Le deuxième argument sera interprété comme 'char'. Par exemple, vous ne pouvez pas utiliser 'memset' pour initialiser les éléments d'un' int [] 'à' 10'. –

+0

@Mehrdad, oui, c'est vrai. –

+1

Mais vous pouvez l'utiliser pour initialiser un tableau de 'uint {8,16,32,64} _t' à' UINT {8,16,32,64} _MAX' en passant 255 comme argument. :-) –

4

Voici une solution qui est compatible à toutes les normes (C89, C99, C++)

Il a l'avantage que vous ne vous soucier de la saisie des données en un seul endroit. Aucun des autres codes n'a besoin de changer - il n'y a pas de nombres magiques. Le tableau est déclaré sur le tas. La table de données est déclarée const.

(Click here to try running it in Codepad)

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

int main() 
{ 
unsigned int i = 0; 
int *myarray = 0; 
static const int MYDATA[] = {11, 22, 33, 44, 55}; 

    myarray = (int*)malloc(sizeof(MYDATA)); 
    memcpy(myarray, MYDATA, sizeof(MYDATA)); 

    for(i = 0; i < sizeof(MYDATA)/sizeof(*MYDATA); ++i) 
    { 
    printf("%i\n", myarray[i]); 
    } 

    free(myarray); 

    return 0; 
} 
+0

'MYDATA' peut également être déclaré' static'. – caf

+0

Je voterais ceci, mais seulement si vous changez 'MYDATA' à' static'. Sinon, la plupart des compilateurs génèreront un très mauvais code pour cela. –

+0

MYDATA sera en .text ou .const pas .data car il est déclaré const. Il est décalé dans la fonction, donc le lien est interne. Statique n'est donc pas nécessaire ou utile. Bien dans mon expérience mais peut-être caf et R ont un compilateur où c'est un problème afin de les apaiser je vais éditer. – T33C

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

int *setarray(int *ar,char *str) 
{ 
    int offset,n,i=0; 
    while (sscanf(str, " %d%n", &n, &offset)==1) 
    { 
     ar[i]=n; 
     str+=offset; 
     i+=1; 
    } 
    return ar; 
} 

int main() 
{ 
    int *sz=malloc(5*sizeof(int)),i; 

    //call 
    setarray(sz,"10 30"); 

    //output 
    for(i=0;i<2;i++) 
     printf("%d\n",sz[i]); 

    return 0; 
} 
Questions connexes