C - Inicializando dinámicamente arreglos
-
05-07-2019 - |
Pregunta
Estoy tratando de encontrar el equivalente de int myArray [n], excepto que no sé qué es n sin entrada.
¿Se supone que el siguiente código funciona? (Necesito usar kmalloc en lugar de malloc).
int * pages;
//... later, after we find out n...
pages = (int *)kmalloc(npages * sizeof(int));
Depurando usando gdb, el valor de las páginas [0] no parece ser 0, ¿se espera esto?
Solución
Sí. La memoria no se inicializa, solo obtienes un puntero a tu parte de memoria.
Necesitará memset
para inicializarlo:
memset(pages, 0, npages * sizeof(int));
Además, a menos que me equivoque, kmalloc
toma un segundo parámetro , el tipo de memoria a asignar.
Otros consejos
malloc
devuelve un puntero a alguna ubicación en el montón que ha asignado para su matriz. No inicializa esa memoria. Puede usar calloc
en lugar de malloc
para inicializar la memoria (configurada a cero), o puede usar memset
después de asignar la memoria y configura la memoria a cero tú mismo.
Dado que está utilizando kmalloc
, probablemente tendrá que usar memset
; No creo que haya un cmalloc
para asignar memoria inicializada en el kernel.
Alternativamente, puedes usar la función del kernel kzalloc :
int * pages;
pages = (int *)kzalloc(npages * sizeof(int), GFP_KERNEL);