You can't do this
char *chrdate(struct weather *wdt, int loop)
char *stdate = (char*)calloc(11,sizeof(char));
sprintf(stdate, "%d/%d/%d", (wdt+loop)->day,(wdt+loop)->month,(wdt+loop)->year);
return stdate; // your function execution end here
free(stdate); // the execution won't reach here
chrdate returns a pointer to memory you have allocated and assigned it to
(pinfo+loop)->date = chrdate(pinfo, loop);
You don't want to
free() it since you will use it next.
for (loop = 0; loop<4; loop++)
printf("%s\n",info[loop].date); // still use it here
Instead, you should call
free((pinfo+loop)->date) when you have finished using that memory.