2013-06-27 71 views
0

我是C编程的新手(长时间重新学习它)。我正在尝试使用malloc动态分配内存到二维数组。我试图按照如下的计算器上的答案如thisthis。但我仍然遇到分段错误。动态分配C数组中的二维数组时出现分段错误

我的代码是如下

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

void allocate2DArray(int **subset, int a, int b) 
{ 
    subset = (int **)malloc(a * sizeof(int *)); 
    int i,j; 

    for(i = 0 ; i < a ; i++) 
    subset[i] = (int *) malloc(b * sizeof(int)); 

    for(i = 0 ; i < a ; i++) 
    for(j = 0 ; j < b ; j++) 
     subset[i][j] = 0; 
} 

int main() 
{ 
    int **subset; 
    int a = 4, b = 4; 
    allocate2DArray(subset, a, b); 
    int i,j; 
    for(i = 0 ; i < a ; i++) 
    { 
    for(j = 0 ; j < b ; j++) 
    { 
     printf("%d ", subset[i][j]); 
    } 
    printf("\n"); 
    } 
} 

当我评论行打印的阵列,它好好尝试给出任何错误和程序的执行没有段故障。请帮助我了解我哪里出错了。

+0

C中的函数参数通过值*传递*。所以你在'main'中的函数调用什么都不做(除了内存泄漏)。 –

回答

2

All problems in computer science can be solved by another level of indirection

void allocate2DArray(int ***p, int a, int b) 
{ 
    int **subset; 
    *p = (int **) malloc(a * sizeof(int *)); 
    subset = *p; 

// ... 
allocate2DArray(&subset, a, b); 
+1

谢谢@ctn ..工作。我也试过了,没有使用int **子集。像这样..'* p =(int **)malloc(a * sizeof(int *));对于(i = 0; i quirkystack

+0

@quirkystack对我来说'void allocate2DArray(int *** p,int a,int b){int i,j; * p =(int **)malloc(a * sizeof(int *)); for(i = 0; i ctn

+0

我的错误..在我的实际程序中没有在* p附近添加paranthesis。谢谢 – quirkystack

0

您必须将int ***subset传递给分配函数。这是因为参数是按值传递的。

0

你需要这样的:

void allocate2DArray(int ***subset, int a, int b) 

这:

allocate2DArray(&subset, a, b); 
0

通过使用int **subset;它不会成为二维数组。它仍然是一维存储和指针指针。

二维数组意味着指针缓冲区的每个元素都必须指向由ctn建议的缓冲区。 他建议*** ptr和* ptr是malloced,它创建了缓冲区的第一维。 现在当你调用allocate2DArray()时,子集被分配了内存,它创建了第二个维度。其中验证我的上面的语句 - 指针缓冲区的每个元素必须指向一个缓冲区。

所以现在所建议的代码 -

*p = (int **) malloc(a * sizeof(int *)); 

创建的阵列,其点的每个元素到缓冲“子集”,其总共创建真实的2D阵列。