Risolti tutti i problemi ce n'è subito qualcun'altro:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TRUE 1
#define FALSE 0

// Dichiarazione della struttura contenente le info per il salvataggio
struct Salvataggio
{
	char *giocatore1;
	char *giocatore2;
};

int salva_partita (char *giocatore1, char *giocatore2);
int carica_partita (struct Salvataggio *caricamento);

main()
{
	char *giocatore1="pippo", *giocatore2="topolino";
	struct Salvataggio *caricamento;

	salva_partita(giocatore1, giocatore2);
	
	// aggiorno le stringhe originali con due stringhe vuote
	strcpy(giocatore1, ""); strcpy(giocatore2, ""); 
	
	// alloco memoria per una struct Salvataggio
	caricamento = (struct Salvataggio *) malloc(sizeof(struct Salvataggio)); 

	carica_partita(caricamento);

	printf("\ngiocatore1: %s\n", caricamento->giocatore1);
	printf("\ngiocatore2: %s\n", caricamento->giocatore2);

	return 0;
}

int salva_partita (char *giocatore1, char *giocatore2)
{
	char *filename = "save.dat";
	FILE *fp;
	int vero=TRUE, falso=FALSE;
	unsigned int len_giocatore1, len_giocatore2;

	if((fp = fopen(filename, "wb")) == NULL)  // apro il file binario in scrittura
		return falso;    // se il file non si apre correttamente la funzione termina
	
	/* conto i caratteri che compongono la stringa giocatore1 compreso il carattere \0 */
	len_giocatore1 = (strlen(giocatore1) + 1);
	/* conto i caratteri che compongono la stringa giocatore2 compreso il carattere \0 */
	len_giocatore2 = (strlen(giocatore2) + 1); 
	
	// salvo la lunghezza della stringa compreso il carattere \0
	if(fwrite(&len_giocatore1, sizeof(unsigned int), 1, fp) != 1)  
	{
		fclose(fp);         // se la scrittura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}
	
	// salvo la lunghezza della stringa compreso il carattere \0
	if(fwrite(&len_giocatore2, sizeof(unsigned int), 1, fp) != 1)  
	{
		fclose(fp);         // se la scrittura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}

	if(fwrite(giocatore1, sizeof(char), len_giocatore1, fp) != len_giocatore1)  // salvo su file giocatore1
	{
		fclose(fp);         // se la scrittura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}

	if(fwrite(giocatore2, sizeof(char), len_giocatore2, fp) != len_giocatore2)  // salvo su file giocatore2
	{
		fclose(fp);         // se la scrittura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}

	fclose(fp); // chiudo il file
	return vero;
}

int carica_partita (struct Salvataggio *caricamento)
{
	char *filename = "save.dat";
	FILE *fp;
	int vero=TRUE, falso=FALSE;
	unsigned int len_giocatore1, len_giocatore2;

	if((fp = fopen(filename, "rb")) == NULL)  // apro il file binario in scrittura
		return falso;    // se il file non si apre correttamente la funzione termina
	
	// leggo la lunghezza della stringa compreso il carattere \0
	if(fread(&len_giocatore1, sizeof(unsigned int), 1, fp) != 1)  
	{
		fclose(fp);         // se la lettura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}
	
	// leggo la lunghezza della stringa compreso il carattere \0
	if(fread(&len_giocatore2, sizeof(unsigned int), 1, fp) != 1)  
	{
		fclose(fp);         // se la lettura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}

	caricamento->giocatore1 = (char *) malloc(len_giocatore1 * sizeof(char));
	caricamento->giocatore2 = (char *) malloc(len_giocatore2 * sizeof(char));

	if(fread(caricamento->giocatore1, sizeof(char), len_giocatore1, fp) != len_giocatore1) // leggo il nome del giocatore1
	{
		fclose(fp);         // se la lettura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}

	if(fread(caricamento->giocatore2, sizeof(char), len_giocatore2, fp) != len_giocatore2) // leggo il nome del giocatore2
	{
		fclose(fp);         // se la lettura non avviene correttamente
		return falso;       // chiudo il file e la funzione termina
	}
	
	fclose(fp);
	return vero;
}
In pratica ho provato a salvare queste due stringhe su file. Questo programma però va in crash. Sicuramente sbaglio qualcosa. Cosa???
Grazie.

p.s. queste due istruzioni creano il problema:
strcpy(giocatore1, ""); strcpy(giocatore2, "");
però per me è essenziale che tutto funzioni anche con queste.