C - Matrici di inizializzazione dinamica
-
05-07-2019 - |
Domanda
Sto cercando di trovare l'equivalente di int myArray [n], tranne per il fatto che non so cosa sia n senza input.
Il seguente codice dovrebbe funzionare? (Devo usare kmalloc invece di malloc).
int * pages;
//... later, after we find out n...
pages = (int *)kmalloc(npages * sizeof(int));
Debug utilizzando gdb, le pagine dei valori [0] non sembrano essere 0 - è previsto?
Soluzione
Sì. La memoria non è inizializzata, ottieni solo un puntatore al tuo pezzo di memoria.
Dovrai memset
per inizializzarlo:
memset(pages, 0, npages * sizeof(int));
Inoltre, a meno che non mi sbagli kmalloc
accetta un secondo parametro , il tipo di memoria da allocare.
Altri suggerimenti
malloc
restituisce un puntatore in una posizione sull'heap che ha allocato per l'array. Non inizializza quella memoria. Puoi usare calloc
invece di malloc
per inizializzare la memoria (impostata su zero), oppure puoi usare memset
dopo aver allocato la memoria e imposta la memoria su zero te stesso.
Dato che stai usando kmalloc
, probabilmente dovrai usare memset
; Non credo ci sia un cmalloc
per allocare memoria inizializzata nel kernel.
In alternativa potresti usare la funzione del kernel kzalloc :
int * pages;
pages = (int *)kzalloc(npages * sizeof(int), GFP_KERNEL);