0

В функции, которая возвращает символ, память должна выделяться динамически. Но можем ли мы освободить память с помощью функции free() после возвращения значения обратно к вызывающей функции?Можно ли использовать 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

Опубликуйте свой код. – LPs

+0

, пока нет вызова 'free()', выделенная память не будет освобождена. До конца выполнения процесса. –

+1

Вы не можете сделать * ничего * после возврата значения. Код недостижим и никогда не будет выполнен. – EJP

ответ

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() it так как вы будете использовать его далее.

for (loop = 0; loop<4; loop++) 
{ 
    printf("%s\n",info[loop].date); // still use it here 
} 

Вместо этого, вы должны позвонить free((pinfo+loop)->date), когда вы закончили использовать эту память.

+0

Что мне делать, чтобы освободить память здесь? –

+1

@KiranCK Напишите отдельную функцию с целью очистки беспорядка. Однако лучше оставить выделение вызывающему. Или еще лучше, не используйте динамическое распределение вообще, так как в коде, который вы отправили, абсолютно нет необходимости. – Lundin