You want to share the structs between processes, but instead you are sharing only pointers to structs. If those pointed to structs that were allocated and initialized before the fork then they would be valid in both processes, but would point to different copies of the structs (malloc() allocates only private memory, never shared). As it is, however, the pointers are only valid in the child, which is the one performing the malloc().
So, instead of an array of pointers, allocate an array of structs:
val_t *val;
/* ... */
size = sizeof(val_t) * LEN;
/* ... */
val = (val_t *) shmat(shmid, 0, 0);
If you do it this way, moreover, there is no need to malloc() (or free()) individual structs.