C - Initialisation dynamique des tableaux
-
05-07-2019 - |
Question
J'essaie de trouver l'équivalent de int myArray [n], sauf que je ne sais pas ce que n est sans entrée.
Le code suivant est-il censé fonctionner? (Je dois utiliser kmalloc au lieu de malloc).
int * pages;
//... later, after we find out n...
pages = (int *)kmalloc(npages * sizeof(int));
En déboguant avec gdb, la valeur des pages [0] ne semble pas être 0 - est-ce attendu?
La solution
Oui. La mémoire n'est pas initialisée, vous obtenez juste un pointeur sur votre bloc de mémoire.
Vous devez memset
pour l'initialiser:
memset(pages, 0, npages * sizeof(int));
De plus, à moins que je ne me trompe, kmalloc
prend un deuxième paramètre , type de mémoire à allouer.
Autres conseils
malloc
renvoie un pointeur sur un emplacement du tas alloué pour votre tableau. Il n'initialise pas cette mémoire. Vous pouvez utiliser calloc
au lieu de malloc
pour initialiser la mémoire (valeur zéro), ou vous pouvez utiliser memset
après avoir alloué la mémoire. et réglez la mémoire sur zéro vous-même.
Puisque vous utilisez kmalloc
, vous devrez probablement utiliser memset
; Je ne crois pas qu'il existe un cmalloc
pour allouer de la mémoire initialisée dans le noyau.
Vous pouvez également utiliser la fonction du noyau de kzalloc . :
int * pages;
pages = (int *)kzalloc(npages * sizeof(int), GFP_KERNEL);