首页 文章

从结构中的2D数组中自由动态分配的内存

提问于
浏览
0

我有一个指向结构的指针,结构中的一个对象是一个int ** . 双指针用于为2d数组动态分配内存 . 我无法弄清楚如何释放这个数组的内存 . 有任何想法吗?

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);

}

修改版(如果其他人有类似的问题)

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

1 回答

  • 2

    你的解放是好的,但你有一个严重的错误

    timeptr = &time;
    return timeptr;
    

    您正在返回局部变量的地址 .

    局部变量在函数的堆栈帧中分配,一旦函数返回,数据将不再存在 .

    您也应该使用 malloc

    timeptr = malloc(sizeof(*timeptr));
    

    而且你必须从 main() 返回 int

相关问题