1) Cada proceso tiene 4 gb de espacio de memoria virtual, pero no es necesario asignarlo todo de una vez. El sistema operativo especifica al MMU qué partes de la memoria física se asignan a su espacio virtual, y qué partes no están mapeadas en absoluto. Los accesos a las partes que no están mapeadas causarán fallas en el procesador y el sistema operativo generalmente genera una segfault. También hay un marcador para "no presente" que le dice al procesador que el área de la memoria no está en el espacio de la memoria física pero está en el espacio de intercambio, entonces el procesador falla y el sistema operativo cambia la página a la memoria física, luego se reanuda el proceso donde lo dejo Para describir una tabla de páginas de procesos, solo necesita unos pocos bytes de memoria, por lo que 100 procesos no usarían tanta memoria hasta que realmente lo soliciten.
2) Hay muchos algoritmos de asignación de memoria. Por lo general, el sistema operativo solo asigna grandes bloques de memoria a la vez, por lo que las llamadas a malloc() solo a veces provocan una llamada al sistema operativo, la mayoría de las veces son los detalles de implementación de la biblioteca estándar C los que manejan la microadministración. No hay garantía de que un acceso fuera de los límites de una matriz produzca una falla seg, ya que podría ser parte de una matriz diferente que se había mallocrado anteriormente, o parte del espacio libre que la biblioteca estándar está rastreando para el futuro asignaciones y por lo tanto no segfault. Sin embargo, existen herramientas de depuración como valgrind que detectarán dichos errores.
3) Los detalles sobre dónde se encuentra cada segmento dependen del sistema operativo, pero para el código que es general y portátil, no hay necesidad de saberlo. Para obtener más información sobre todos estos temas, consulte el wiki osdev, específicamente la parte en paging y memory allocation.
Como nadie notó esto anteriormente, se debe señalar que si asigna una matriz de 2 bytes, un [2] no será parte de esa matriz, solo serán [0] y [1]. –
¿Malloc dará segmentación cada vez? ya que malloc asignará el espacio desde el montón y luego el tamaño del montón será normalmente muy grande, ¿por qué no podemos acceder al a [2]? debería dar algún valor aleatorio. la segmentación significa que no podemos acceder a eso. Corrígeme si estoy equivocado – RATHI
Realmente depende de tu máquina y compilador. Pero, en resumidas cuentas, si no ha asignado la memoria para su programa, no debe acceder ni modificarla. –