2009-11-26 8 views
0

J'essaie de trouver l'équivalent de int myArray [n], sauf que je ne sais pas ce que n est sans entrée.C - Initialisation dynamique des tableaux

Le code suivant est-il censé fonctionner? (J'ai besoin d'utiliser kmalloc au lieu de malloc).

int * pages; 
//... later, after we find out n... 
pages = (int *)kmalloc(npages * sizeof(int)); 

avec gdb Débogage, les pages de valeur [0] ne semble pas être 0 - Est-ce prévu?

Répondre

3

Oui. La mémoire n'est pas initialisée, vous obtenez juste un pointeur vers votre morceau de mémoire.

Vous devez memset pour l'initialiser:

memset(pages, 0, npages * sizeof(int)); 

De plus, à moins que je me trompe kmalloc prend un second parameter, le type de mémoire à allouer.

+0

Merci pour l'exemple ajouté! – stringo0

5

malloc renvoie un pointeur sur un emplacement du segment de mémoire affecté à votre tableau. Il n'initialise pas cette mémoire. Vous pouvez utiliser calloc au lieu de malloc pour que la mémoire soit initialisée (mise à zéro), ou vous pouvez utiliser memset après avoir alloué la mémoire et mettre la mémoire à zéro vous-même. Puisque vous utilisez kmalloc, vous devrez probablement utiliser memset; Je ne crois pas qu'il y ait un pour allouer de la mémoire initialisée dans le noyau.

0

Sinon, vous pouvez utiliser la fonction du noyau kzalloc:

int * pages; 
pages = (int *)kzalloc(npages * sizeof(int), GFP_KERNEL);