Ho individuato un'evidente errore, andavo a determinare l'intorno del punto senza prima inizializzare tutti gli elementi della matrice. Ho quindi modificato due funzioni:

codice:
/**
 * 
 *
 */
Letter around_of_letter( Matrix M, Letter L) {
	
	int x,y;
	int i=0;
	
	for(x=0; x<SIDE; x++)
		for(y=0; y<SIDE; y++) {
			
			if( distance_between_letters( M[x][y], L ) == 1 ) 
				L.around[i++] = &M[x][y]
					;
			else 
				L.around[i++] = NULL
					;
		}
	return L ; 
}


/**
 * 
 * 
 */
Matrix matrix_fill( Matrix M, char *W ) {
	
	int x,y;
	int i = 0;
	
	for(x=0; x<SIDE; x++)
		for(y=0; y<SIDE; y++)  { 
			 M[x][y].letter = W[i++];
			 M[x][y].position.x = x;
			 M[x][y].position.y = y;
		}
	for(x=0; x<SIDE; x++)
		for(y=0; y<SIDE; y++)
			M[x][y] = around_of_letter( M, M[x][y] ) 
				; 
	return M ;
}
Ma il problema persiste, inoltre in Letter.position sovente trovo salvati valori in'attesi e improponibili, tra l'altro molto simili agli indirizzi della zona di memoria in cui lavoro. Cio provoca caos nel calcolo delle distanze e cosi di seguito.
Non me ne capacito...