La directiva #zero_ram pone a 0 todos lso registros definidos en el programa, pero no TODA la RAM, si quisieras borrar (me refiero a borrar a poner a 0 ) todo tendrias que hacerte un codigo que lo haga.
Que en un 18f tranquilamente usas los registros FSR y POSTINC para hacer el loop completo de toda la RAM, pero que en C podria traer problemas hacerlo... ya que estarias queriendo limpiar toda la RAM y puede que C use algun lugar de la memoria para almacenar algo que es util para el mismo compilador.
Igual en C si usas un pedazo de RAM para almacenar algo lo haces definiendo el espacio, ya sea que es un int, o un float, o un vector de 30 bytes, etc y a estos los inicializas con un valor si fuera necesario. Nunca deberias de usar una porcion de RAM que no esta definida. Puede que no inicializada (con un valor) pero definida estan.