I have a pointer to a struct and one of the objects in the struct is a int **. The double pointer is used to dynamically allocate memory for a 2d array. I am having trouble figuring out how to free the memory for this array. Any ideas?
struct time_data {
int *week;
int *sec;
int **date;
};
typedef struct time_data time_data;
time_data *getTime(time_data *timeptr, int rows, int cols) {
int i = 0;
time_data time;
// allocate memory for time.date field
time.date = (int **)malloc(rows*(sizeof(int *))); // allocate rows
if(time.date == NULL)
printf("Out of memory\n");
for(i=0; i<rows; i++) {
time.date[i] = (int *)malloc(cols*sizeof(int));
if(time.date[i] == NULL)
printf("Out of memory\n");
}
timeptr = &time;
return timeptr;
}
int main(int argc, const char * argv[]) {
time_data *time = NULL;
int rows = 43200, cols = 6;
int i;
time = getTime(time, rows, cols);
for(i=0; i<rows; i++)
free(time->date[i]); // problem here
free(time->date);
}
Modified Version (in case anyone else has similar issue)
struct time_data {
int *week;
int *sec;
int **date;
};
typedef struct time_data time_data;
time_data *getTime(int rows, int cols) {
int i = 0;
time_data *time = malloc(sizeof(*time));
// allocate memory for time.date field
time->date = (int **)malloc(rows*(sizeof(int *))); // allocate rows
if(time->date == NULL)
printf("Out of memory\n");
for(i=0; i<rows; i++) {
time->date[i] = (int *)malloc(cols*sizeof(int));
if(time->date[i] == NULL)
printf("Out of memory\n");
}
return time;
}
int main(int argc, const char * argv[]) {
time_data *time = NULL;
int rows = 43200, cols = 6;
int i;
time = getTime(rows, cols);
for(i=0; i<rows; i++)
free(time->date[i]); // problem here
free(time->date);
return 0;
}
Your freeing is ok, but you have a severe error
timeptr = &time;
return timeptr;
you are returning the address of a local variable.
The local variable is allocated in the stack frame of the function, and once the function returns, the data will no longer exist.
You should use malloc
for that too
timeptr = malloc(sizeof(*timeptr));
and also you must return an int
from main()
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.