c - 在 c 的子函数中分配内存时出现奇怪的段错误

标签 c segmentation-fault

这是我的代码,它为参数指定大小的矩阵分配空间,并返回指向所述矩阵的指针:

int **allocateSpace(int row, int col){  
   int i;
   int **a;
   a = malloc(sizeof(int *) * row);
   for(i = 0; i < row; i ++)                                               
      a[i] = malloc(sizeof(int) * col);  
   return a;
}      

以上代码按预期工作。

但是,当我将代码更改为以下形式时,出现了段错误:

void allocateSpace(int **a, int row, int col){
    int i;
    a = malloc(sizeof(int *) * row);
    for(i = 0; i < row; i ++)
      a[i] = malloc(sizeof(int) * col);
}

似乎从 allocateSpace() 函数返回时,分配的内存被释放了(因为我遇到了段错误)。但为什么?我所做的只是为给定的指针分配内存,这一切都在子函数中完成。

总结一下我的问题:为什么我在第二段代码中遇到段错误? 非常感谢!

最佳答案

因为需要传入一个指向指针的指针才能分配分配的内存:

void allocateSpace(int ***a, int row, int col){
    int i;
    *a = malloc(sizeof(int *) * row);
    for(i = 0; i < row; i ++)
      ( *a )[i] = malloc(sizeof(int) * col);
}

要调用它,您需要传递 int** 的地址:

int** ppData;

allocateSpace( &ppData, 10, 10 );

关于c - 在 c 的子函数中分配内存时出现奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10009281/

相关文章:

c - ANSI C sscanf 给出段错误

c - 如何在 printf 中检测转义序列?

c - 在C中覆盖文本文件

c - 这段代码如何打印奇数和偶数?

c - 将现有的 C 代码移植到 ARMv7

c - 我得到了意外的输出

c - 将c字符串解析为指针数组时出现段错误

c++ - 在 gdb 中使用 coredump 时,我如何确切知道哪个线程导致了 SIGSEGV?

C:从函数返回 char* 会导致 printf 崩溃

c - c实现链表添加节点时出现段错误