2010-03-21 3 views
9

Je dois faire une chose simple, ce que je faisais plusieurs fois en Java, mais je suis coincé en C (pur C, pas C++). La situation se présente comme suit:Initialisation d'un pointeur dans une fonction séparée 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; 
} 

J'ai une fonction « initialisation », qui doit attribuer un pointeur donné à certaines données affectées (n'a pas d'importance). Comment est-ce que je devrais donner un pointeur à une fonction afin que ce pointeur soit modifié, et puis puisse être employé plus loin dans le code (après que l'appel de fonction renvoie)?

Répondre

18

Vous devez ajuster le pointeur * a, cela signifie que vous devez passer un pointeur vers le * a. Vous le faites comme ceci:

int *a; 

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

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

Sinon (et mieux à mon humble avis) 'int * initArray (size_t s) {return malloc (sizeof (int) * s); } 'et ensuite l'utiliser comme int int * arr = initArray (SIZE);' –

+0

Merci beaucoup :) – pechenie

+0

Chris, je ne devrais pas, parce que cet exemple est une sorte de non naturel. La fonction "initArray" dans ma situation réelle renvoie une valeur, donc je ne peux pas l'utiliser. Mais merci quand même :) – pechenie

5

Vous assignez arr par valeur à l'intérieur initArray, de sorte que toute modification de la valeur de arr sera invisible au monde extérieur. Vous devez passer par arr pointeur:

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