Il seguente codice mi va in segmentation fault al momento del ritorno dalla finzione "createf" richiamata nel main.
Ho fatto il debugger con DDD e mi pare che vada bene tranne che quando dovrebbe ritornare 0 e invecie va in seg fault.
Qualcuno può aiutarmi?

codice:
 
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdarg.h>
#include <time.h>		 //per la gestione del time
#include <stdio.h>



int createf(const char *path,const char *mode,char* fmt,...) //funzione con numero di parametri variabile, i primi 2 servono per la fopen, il terzo è una stringa di formato per i parametri variabili. E'un errore nn passare la stringa di formato, al limite passarla vuota per non inserire metadati. Eventuali parametri in più rispetto a quelli specificati nella stringa di formato vengono ignorati.
{
	va_list ap;	//il puntatore a argomento 
	FILE* file; //il file da creare o modificare
	FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
	
	int lung;
	char str[1];
	char* stringa;
	char* sval;
	float fval;
	struct tm * t;
	time_t tx;
	
	if ((file=fopen(path, mode))==NULL)
	{
		printf("errore1");
	}
	fprintf(filesave,"%s,",path);
	va_start(ap,fmt);
	while(*fmt!='\0')
	{
		if(isalpha(*fmt)!=0)
		{
			lung=strcspn(fmt," ");
			stringa=strncpy(str,fmt,lung);
			if(fputs(stringa,filesave)==EOF) //scrive il nome del metadato
			{
				printf("errore2");//gestione errore in fputs
			}
			fmt=fmt+lung; //fmt punta al successivo formato di tipo metadato(%s,%n..)
			if(isspace(*fmt)==0)
			{
				printf("errore3");//trattamento errore, non c'è lo spazio dopo il nome di metadato
			}
			fmt++;
			if(*fmt=='%')
			{
				fmt++;
				switch(*fmt)
				{
					case 's':
						sval=va_arg(ap,char*);
						fprintf(filesave,"%s,",sval);
						fmt++;
						break;
					case 'n':
						fval=va_arg(ap,double);
						fprintf(filesave,"%f,",fval);
						fmt++;
						break;
					case 'd':
						t=va_arg(ap,struct tm*);
						tx=mktime(t);
						if (tx == (time_t) (-1))
      					{
      						printf ("Errore! %ld\n", (long int) tx); //trattamento errore data da rivedere
     					}
    					fprintf(filesave,"%d/%d/%d,",t->tm_mday,t->tm_mon+1,t->tm_year+1900);
    					fmt++;
						break;
					default :
						printf("errore4");//trattamento errore formato sconosciuto
						break;
				}
			}
			else
			{
				printf("errore5");//gestione errore, non c'è % dopo il nome del metadato e lo spazio
			}
		
		}
		
	}
	fprintf(filesave,"\n");
	
	return 0;
	
}



int createfwm(const char *path,const char *mode)
{
	FILE* file;
	FILE* filesave=fopen("save.sav","a"); //il file di salvataggio delle associazioni
	if ((file=(fopen(path, mode)))==((FILE*)NULL))
	{
		return EOF; //gestione errore
	}
	fprintf(filesave,"%s\n",path);
	if(fclose(filesave)==EOF)
	{
		return EOF; //gestione errore
	}
	return 1;
}

int main()
{
	printf("tuttook0\n");
	struct tm* tempo;
	tempo->tm_year=150;
	tempo->tm_mday=15;
	tempo->tm_mon=5;
	char car;
	int a=createfwm("prova.pro","w");
	int b=createfwm("provi.pri","w");
	int c=createfwm("prove.pre","w"); 
	printf("tuttook1");
	int d=createf("provu.pru","w","proprietario %srevisione %ndata %d","paolo",5,tempo);
	printf("tuttook2");
	FILE* fil=fopen("save.sav","r");
	while((car=fgetc(fil))!=EOF)
	{
		if(car=='\0')
		printf("errore");
	}
	printf("tuttook");
	fclose(fil);
	return 1;
}
L'errore che DDD mi da è:
Error accessing memory address 0x86f6972: Input/output error