【问题标题】:Free dynamically allocated memory from 2D array within a struct从结构内的二维数组中释放动态分配的内存
【发布时间】:2015-01-29 02:07:50
【问题描述】:

我有一个指向结构的指针,结构中的一个对象是一个 int **。双指针用于为二维数组动态分配内存。我无法弄清楚如何释放该数组的内存。有什么想法吗?

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

【问题讨论】:

  • 什么想法?你做对了。只需从 malloc 中删除演员表。而且,printf("Out of memory\n"); 是不够的,你应该 abort 而不是取消引用指针。
  • 您正确地释放了它。但是您没有正确分配它。 getTime 正在返回一个无效的局部变量的地址。
  • 为什么要从 malloc 中删除演员表?

标签: c pointers struct malloc multidimensional-array


【解决方案1】:

你的释放没问题,但是你有一个严重的错误

timeptr = &time;
return timeptr;

你正在返回一个局部变量的地址。

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

你也应该使用malloc

timeptr = malloc(sizeof(*timeptr));

你还必须从main()返回一个int

【讨论】:

  • 我将代码更改为 malloc 指针的内存,但是当我尝试释放 main 中的内存时仍然遇到相同的错误。线程 1:EXC_BAD_ACCESS(代码=1,地址 0x0)。如果我删除 for 循环,一切运行正常。如果我错了,请纠正我,我认为我正在将地址返回给我分配的二维数组。 timeptr 仅用于存储该地址,直到可以返回为止。我是否需要在整个结构时间内分配内存,而不是针对特定字段?
  • 感谢您为我指明正确的方向。我更改了 getTime 的输入参数,去掉了 time_data 时间声明,只使用了指向结构的指针。必须将所有对字段的引用更改为时间-> 日期格式。现在似乎可以工作了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
  • 2017-06-04
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多