2012-11-07 64 views
2

我遇到想写具有以下功能分配矩阵(段错误exc_bad_accesskern_invalid_address)的第二排,当一个问题:二维矩阵分配功能段错误(由PARAM返回矩阵)

这里是我的页头功能:

int amatrix(char*** m, const int i, const int j) 
{ 

    int k; 

    (*m) = (char**) malloc(sizeof(char*) * i); 
    if ((*m) == NULL) { 
     return ERROR; 
    } 

    for (k = 0; k < i; k++) { 
     (*m)[k] = (char*) malloc(sizeof(char) * j); 
     if ((*m)[k] == NULL) { 
      return ERROR; 
     } 
    } 

    return SUCCESS; 
} 

我把它用:

char** matrix; 
if (amatrix(&matrix, i, j)) { ... 

编辑: 根据要求:

#define ERROR 00 
#define SUCCESS 01 

的访问,其中的麻烦是:

int gmatrix(char*** m, const int i, const int j) 
{ 
int k, l; 

for (k = 0; k < i; k++) { 
    for (l = 0; l < j; l++) { 
     printf("Matrix[%d][%d] = ", k, l); 
     scanf(" %c", m[k][l]); 
    } 
} 

return SUCCESS; 
} 

谢谢你快速作出回应!

+2

你能共享一个完整的例子(包括''ERROR'and值SUCCESS',代码试图写入分配矩阵,...)? –

+1

我们可以看到您的访问权限吗?这里一切似乎都很好。 – md5

+1

我会声明一个2d字符数组为'char c2d [42] [43]'。或者分配它'char * pc2d = calloc(42 * 43,1)' – alk

回答

2

gmatrix功能应该采取m作为char**参数,不char***,因为它并不需要改变像amatrix做(只有它指向)的价值。

那么你应该将scanf函数调用更改为:

scanf(" %c", &m[k][l]); 

您当前密码(与char*** m)不起作用,因为m[k]会给未定义行为时k!=0,因为只有m指向一个单一char**

如果mchar***,scanf函数调用需要的样子:

scanf(" %c", &(*m)[k][l]); 
+0

tyvm,它的工作! 我不知道未定义的行为,你能解释更多吗?为什么当k!= 0时它是不确定的? – bellati

+0

@bellati:假设你有'int a; int * p =&a'。然后'p [0]'是好的,但'p [1]'是未定义的,因为'p'只指向一个'int'。在这里也是一样,除了'char **'而不是'int'。 – interjay

+0

不错,现在我明白了。 freematrix函数怎么样?免费需要修改地址还是只修改矩阵指向的地址?还有什么方法可以测试一些东西是否已经被释放? Tyvm提前! – bellati