簡體   English   中英

在函數中返回值后可以使用free()嗎?

[英]Can we use free () after returning a value in functions?

在返回char的函數中,必須動態分配內存。 但是我們可以在將值返回給調用函數之后使用free()釋放內存嗎?

//程序在一個結構中打印今天和過去三天的天氣數據

#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;
}

你做不到

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM