2010-11-27 10 views
12

En C, sé que puedo hacer una serie como esta¿Se pueden (re) establecer todos los valores de una matriz en una línea (después de que se haya inicializado)?

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

Sin embargo, imaginar la matriz ya estaba inicializado como

int myarray[5]; 

y luego en algún momento después, me quería establecer/cambiar todos los valores sin ir

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

, sino más bien, algo más parecido a

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

La razón por la que pido esto es porque si Declaro mi arsenal en el montón, voy a inicializar la matriz como:

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

Entonces me gustaría ser capaz de entrar en todos los valores de una línea (principalmente para hacer que mi código parezca más limpio)

Respuesta

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

¿No es esto solo C99? –

+3

Sí. Pero cuando alguien da una respuesta de C++ usando plantillas, ¿requiere un comentario que requiera C++ 98? O cuando uso un prototipo de función en C, ¿debo mencionar que no funcionará en las implementaciones anteriores a ANSI C? C99 ** es ** el lenguaje C actual. –

+3

@R .: Desafortunadamente, muchas personas están atrapadas con C89, p. Microsoft todavía no tiene soporte C99 en Visual Studio, y muchos estudiantes todavía tienen que usar compiladores anticuados como Turbo C. Por lo tanto, probablemente no esté justificado suponer que la mayoría de las personas puedan usar funciones específicas de C99. –

1

No, C no tiene esa característica. Si está configurando todos los elementos de la matriz con el mismo valor, use memset(3).

+5

Esta respuesta puede ser engañosa. 'memset' no asigna" elementos de matriz "a un valor. Asigna * bytes * en un bloque de memoria a un valor específico. El segundo argumento se interpretará como 'char'. Por ejemplo, no puede usar 'memset' para inicializar elementos de un' int [] 'a' 10'. –

+0

@Mehrdad, sí, correcto. –

+1

Pero puede usarlo para inicializar una matriz de 'uint {8,16,32,64} _t' a' UINT {8,16,32,64} _MAX' pasando 255 como argumento. :-) –

4

Aquí es una solución que es compatible con todos los estándares (C89, C99, C++)

Tiene la ventaja de que sólo se preocupe por introducir los datos en un solo lugar. Ninguno de los otros códigos necesita cambiar, no hay números mágicos. Array se declara en el montón. La tabla de datos se declara 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' también se puede declarar' static'. – caf

+0

Yo votaría esto, pero solo si cambia 'MYDATA' a' static'. De lo contrario, la mayoría de los compiladores generarán un código muy malo para él. –

+0

MYDATA estará en .text o .const not .data porque está declarado const. Se etiqueta dentro de la función, por lo que el enlace es interno. Por lo tanto, Static no es necesario ni útil. Bueno, en mi experiencia, pero tal vez caf y R tienen un compilador donde es un problema, así que para aplacarlos editaré. – 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; 
} 
Cuestiones relacionadas