2010-03-21 16 views
9

Necesito hacer algo simple, que solía hacer muchas veces en Java, pero estoy atrapado en C (C puro, no C++). La situación se ve así:Inicializando un puntero en una función separada en C

int *a; 

void initArray(int *arr) 
{ 
    arr = malloc(sizeof(int) * SIZE); 
} 

int main() 
{ 
    initArray(a); 
    // a is NULL here! what to do?! 
    return 0; 
} 

tengo alguna función "inicialización", que debe asignar un puntero, dados a algunos datos asignados (no importa). ¿Cómo debería dar un puntero a una función para que este puntero se modifique y luego se pueda utilizar más en el código (después de que vuelva la llamada a la función)?

Respuesta

18

Debe ajustar el puntero * a, esto significa que debe pasar un puntero al * a. Usted lo hace así:

int *a; 

void initArray(int **arr) 
{ 
    *arr = malloc(sizeof(int) * SIZE); 
} 

int main() 
{ 
    initArray(&a); 
    return 0; 
} 
+2

alternativa (y mejor en mi humilde opinión) 'int * initArray (size_t s) {return malloc (sizeof (int) * s); } 'y luego usarlo como' int * arr = initArray (SIZE); ' –

+0

Muchas gracias :) – pechenie

+0

Chris, no debería, porque este ejemplo es poco natural. La función "initArray" en mi situación real devuelve un valor, por lo que no puedo usarlo. Pero gracias de todos modos :) – pechenie

5

está asignando arr por valor dentro initArray, por lo que cualquier cambio en el valor de arr será invisible para el mundo exterior. Tiene que pasar por arr puntero:

void initArray(int** arr) { 
    // perform null-check, etc. 
    *arr = malloc(SIZE*sizeof(int)); 
} 
... 
initArray(&a); 
Cuestiones relacionadas