2010-11-21 17 views
6

Tengo una matriz que quiero hacer global, y quiero inicializarla en una llamada a función. quiero declarar primero sin saber su tamaño:C - Inicializando una matriz global en una función

char str[]; 

y más tarde inicializarlo:

str = char[size]; 

¿Cómo puedo hacer esto? Soy muy nuevo en c y quizás estoy yendo completamente mal aquí, cualquier ayuda sería muy apreciada.

Respuesta

7

La manera de hacerlo es con malloc. En primer lugar declarar simplemente un puntero:

char *str; 

Luego, en la función init que se malloc:

str = malloc(sizeof(*str) * size_of_array); 

Esto asigna size_of_array elementos del tamaño que str puntos a (char en este caso).

usted debe comprobar si la asignación no se pudo:

if (str == NULL) { 
    // allocation failed 
    // handle the error 
} 

Normalmente hay que asegurarse de que free esta memoria asignada cuando haya terminado con él. Sin embargo, en este caso str es global, por lo que nunca sale del alcance, y la memoria será free d cuando finalice el programa.

+4

En C realidad no se debe emitir el resultado de malloc - te solo realmente se necesita hacer eso en C++; se debe evitar en C, ya que puede enmascarar advertencias útiles. –

+2

Si quiere ser general, use 'sizeof (* str)', para que no tenga que repetir el nombre del tipo. Además, en C no deberías lanzar el resultado de malloc. –

+2

@Paul, @Ben: gracias, actualicé el anwer –

1
char* str; 

str = (char*)malloc(size*sizeof(char)); 

Puede omitir el *sizeof(char) desde sizeof(char) == 1 por definición.

No se olvide de desasignar la memoria utilizando free

+2

Si quiere ser general, use 'sizeof (* str)', para que no tenga que repetir el nombre del tipo. Además, en C no deberías lanzar el resultado de malloc. –

+1

En C no deberías realmente lanzar el resultado de malloc, solo necesitas hacerlo en C++, se debe evitar en C, ya que puede enmascarar advertencias útiles. –

1

Crear una char* str; lugar de una matriz. Luego, asigne la cantidad requerida de memoria usando malloc o calloc y realice la inicialización en la llamada a la función.

2

Haga su declaración de matriz mundial aspecto:

char *str = NULL; 

Luego, en su función de inicialización hacer algo como esto:

void init(int size) 
{ 
    ... 
    str = malloc(size * sizeof(char)); 
    ... 
} 
+1

'sizeof (char)' es 1 por definición. Si desea escribir código que funcione con cualquier tipo, use 'sizeof (* str)'. –

+0

@Ben: cierto, pero es un buen hábito incluir el 'sizeof' independientemente del tipo.Soy muy consciente de los argumentos a favor de 'sizeof (* str)' pero aún prefiero 'sizeof (char)' en esta instancia. –

Cuestiones relacionadas