【问题标题】:Realloc 2D and functionsRealloc 2D 和函数
【发布时间】:2015-01-04 22:14:07
【问题描述】:

我想在与 main 不同的函数中重新分配 2D 矩阵,但不幸的是,我得到了一个无效的指针错误。我已阅读其他答案,但看不到我的错误在哪里。我的代码是:

void example(double* w, size_t s){
    w=realloc(w,(s+1)*sizeof(double));
    w[s]=3;
}

int main(int argc, char *argv[]){
    double w[100][1];
    int i;

    for(i=0;i<100;i++){
        example(w[i],sizeof(w[i])/sizeof(w[i][0])
    }

    free(w);
    return 1;
}

所以数组的第一层总是固定的,但第二层可以改变。这有什么问题?

更正:

int main(int argc, char *argv[]){
    double **w;
    int i;

    w=malloc(100*sizeof(double *));

    for(i=0;i<100;i++){
        w[i]=malloc(1*sizeof(double));
        example(w[i],sizeof(w[i])/sizeof(w[i][0])
    }

    free(w);
    return 1;
}

【问题讨论】:

  • wexample 中的一个局部变量。对它的所有更改都是函数本地的。
  • sizeof(w[i][0] 在运行时将不知道更好地使用 example(&w[i], 'desired number of doubles to alloc' );
  • 每个 malloc() 或 realloc() 都需要检查返回码以确保操作成功。
  • w 数组,一旦分配,需要将所有条目设置为 NULL。所以(在 ​​main() 结束时)所有内存分配都可以传递给 free(),首先是辅助指针 (w[x]),然后是指向 w 的指针
  • 这一行:free(w);必须在所有子内存分配通过 for( i=0;i

标签: c function realloc


【解决方案1】:

w 指针不是动态分配的(它不是来自 realloc 或 malloc),因此将它作为参数传递给 realloc 是无效的。另外,如果你想在 main 中释放它,你需要将 new 指针传回给 main。

【讨论】:

    【解决方案2】:

    您需要先分配内存,然后才能重新分配或释放内存。此外,对于您分配内存的每次迭代,您需要释放它,您可以 free(w) 但它所做的只是删除对 w 的内存引用,而不是实际释放所有内存。对于您 malloc 或 realloc 的所有内容,您需要返回并释放它,这样您就不会出现任何内存泄漏。您需要一个像您的示例一样的函数,但要释放所有内存而不是分配它。

    只是我的想法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 2014-01-31
      • 2014-01-31
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-19
      • 2022-01-09
      相关资源
      最近更新 更多