在返回char的函数中,必须动态分配内存。但是我们可以在将值返回给调用函数后使用free()释放内存吗?
//计划在结构中打印今天和过去3天的天气数据
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
struct weather
{
char *date;
int month;
int day;
int year;
unsigned int h_temp;
unsigned int l_temp;
int max_wind_speed;
int preciption;
char notes [80];
};
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;
free(stdate);
}
void prev_date(int loop, struct weather *pdate)
{
int lmonth = (pdate+(loop-1))->month-1; //assigning previous day's month to local variable
if ( ((pdate+(loop-1))->day == 1) && ((pdate+(loop-1))->month == 1) )
{
(pdate+loop)->year = (pdate+(loop-1))->year-1 ;
(pdate+loop)->month = 12;
(pdate+loop)->day = 31;
}
else if (((pdate+(loop-1))->day == 1) && ((pdate+(loop-1))->month != 1))
{
(pdate+loop)->year = (pdate+(loop-1))->year ;
(pdate+loop)->month = (pdate+(loop-1))->month-1 ;
//assigned month as per struct tm
if ( (lmonth == 4) || (lmonth == 6) || (lmonth == 9) || (lmonth == 11) )
{
(pdate+(loop))->day = 30; //assigning 30 days for respective months
}
//checking for leap year and assigning days for february
else if (lmonth == 2)
{
if ((pdate+(loop-1))->year % 4 == 0)
{
(pdate+(loop))->day = 29;
}
else
{
(pdate+(loop))->day = 28;
}
}
//assigning days for rest of the months
else
{
(pdate+(loop))->day = 31;
}
}
else if ( (pdate+(loop-1))->day != 1)
{
(pdate+loop)->year = (pdate+(loop-1))->year ;
(pdate+loop)->month = (pdate+(loop-1))->month;
(pdate+loop)->day = (pdate+(loop-1))->day-1;
}
}
void collect_data (struct weather *pinfo)
{
int loop;
char yes_no[2];
time_t curtime; //declaring time variable
//storing current system time in the time variable
time(&curtime);
//storing current time to time structure
struct tm * wdate = localtime (&curtime);
for (loop=0;loop<4;loop++)
{
if (loop == 0)
{
(pinfo+loop)->day = wdate->tm_mday;
(pinfo+loop)->month = wdate->tm_mon+1;
(pinfo+loop)->year = wdate->tm_year+1900; ;
}
else
{
prev_date(loop,pinfo);
}
(pinfo+loop)->date = chrdate(pinfo, loop);
if (loop == 0)
{
printf("Today's weather details\n");
printf("-----------------------\n");
}
else
{
printf("\n\nEnter weather data for %s\n",(pinfo+loop)->date);
printf("------------------------------------");
}
printf("\nEnter the high temperature of the day:");
scanf("\n%d",&(pinfo+loop)->h_temp);
printf("\nEnter the low temperature of the day:");
scanf("\n%d",&(pinfo+loop)->l_temp);
printf("\nEnter the maximum wind speed of the day:");
scanf("\n%d",&(pinfo+loop)->max_wind_speed);
printf("\nEnter the perciption of the day:");
scanf("\n%d",&(pinfo+loop)->preciption);
printf("\nDo you have any notes about the weather of the day (y/n):");
scanf("\n%[^\n]s",yes_no);
if (strcmp(yes_no,"y")==0)
{
printf("\nNotes (Max Characters to be used is 80 incl. spaces):\n");
scanf("\n%79[^\n]s",(pinfo+loop)->notes);
}
else
{
printf("Notes are blank. Processing save...");
}
}
}
int main ()
{
struct weather info [4];
int loop;
collect_data(info);
for (loop = 0; loop<4; loop++)
{
printf("%s\n",info[loop].date);
}
return 0;
}
答案 0 :(得分:2)
你不能这样做
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
返回指向已分配的内存的指针并将其分配给
(pinfo+loop)->date = chrdate(pinfo, loop);
你不想free()
,因为你接下来会使用它。
for (loop = 0; loop<4; loop++)
{
printf("%s\n",info[loop].date); // still use it here
}
相反,您应该在使用完该内存后调用free((pinfo+loop)->date)
。