MEMVISUALIZER/ C DEBUGGER
C main.c C · simulador
Línea 1, Col. 1int 4 B · puntero 8 B
CONSOLASalida del programa
La salida de printf aparecerá aquí.
▦ Memoria en vivo
0 variables · 0 bytes

Bytes de objetos simulados, incluido el relleno de structs.

PASO 01 / 01Preparado para ejecutar
Preparado

AYUDA / MEMVISUALIZER

«Nuevo código» abre un editor vacío. Escribe C o elige un ejemplo. Cada paso muestra la memoria después de la operación resaltada. Usa la barra de tiempo para volver a cualquier momento.

  1. Ejecuta o avanza para observar cómo aparecen y cambian las variables.
  2. Pulsa un bloque para inspeccionar su dirección, valor y bytes. Los punteros muestran su destino.
  3. Prueba la recursión para ver cómo cada llamada crea su propio marco en la pila.

Cadenas en memoria

char *s = "hola" guarda un puntero de 8 bytes al primer carácter de un literal de solo lectura. char s[] = "hola" guarda 5 bytes en el propio array: h, o, l, a y el terminador \0. Al pasar el array a printf, se usa la dirección de su primer elemento. El formato %s lee hasta el primer byte cero. Los caracteres no ASCII se codifican en UTF-8 y pueden ocupar varios bytes.

Hilos y mutex

El simulador admite pthread_create, pthread_join, pthread_self, pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_unlock y sched_yield. Cada hilo tiene su pila; Global y Heap son compartidos. Los mutex muestran propietario y esperas. No son hilos del sistema operativo: el planificador intercala pasos, separando la lectura y escritura de las actualizaciones. La misma semilla reproduce el orden. Los botones Paso T permiten elegir el siguiente hilo listo.

La detección de carreras usa el orden establecido por create, join y mutex. Una carrera de datos en C implica comportamiento indefinido: los resultados mostrados son ilustrativos. Se detecta deadlock cuando todos los hilos vivos están bloqueados. Máximo 16 hilos, 2.000 pasos, mutex no recursivos y atributos NULL. No se admiten atomics, variables de condición, detach ni pthread_exit. El retorno de main termina el proceso completo.

Contadores de memoria

Los contadores suman los bytes de los objetos vivos en cada paso, incluidos los arrays, punteros y el relleno interno de structs. RODATA incluye los literales y las cadenas de formato de printf. No se incluyen instrucciones, direcciones de retorno, metadatos del asignador ni el consumo del navegador. Los espacios entre direcciones simuladas no representan bytes ocupados.

Typedef y macros

typedef admite alias de tipos escalares, punteros y structs con o sin nombre, también dentro de bloques. #define admite constantes y macros con argumentos; #undef elimina una definición. Las definiciones pueden continuar con una barra inversa al final de la línea. La expansión conserva las líneas originales y no sustituye texto dentro de cadenas o comentarios. No se admiten alias de arrays o funciones, macros variádicas, #, ## ni directivas condicionales (#if, #ifdef). Las cabeceras #include siguen siendo informativas.

Subconjunto de C

Admite char, short (2 B), int (4 B), long (8 B), punteros (8 B), structs con campos y arrays, funciones, recursión, if/else, while, for, printf, malloc y free. Los structs usan alineación natural y pueden contener otros structs o punteros; se accede a los campos con . y ->. Los argumentos struct por valor, floats, casts y bibliotecas externas aún no están admitidos.

La traza se actualiza al editar. Se limita a 2.000 pasos y 60 llamadas para evitar ejecuciones infinitas. Los errores detienen la simulación y conservan los pasos anteriores.