2

次の関数で割り当てられた行列の2番目の行(segfaultexc_bad_accessと)を書き込もうとすると問題が発生します。kern_invalid_address

これが私の割り当て関数です:

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

迅速な返信ありがとうございます!

4

1 に答える 1

2

関数は、のように値を変更する必要がないため(ポイントするもののみ) 、パラメーターとしてではなく、パラメーターとしてgmatrix受け取る必要があります。mchar**char***amatrix

次に、scanf呼び出しを次のように変更する必要があります。

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

現在のコード(with char*** m)は機能しません。これは、が単一のを指しているため、m[k]が未定義の動作を与えるためです。k!=0mchar**

mがの場合char***、scanf呼び出しは次のようになります。

scanf(" %c", &(*m)[k][l]);
于 2012-11-07T14:19:26.307 に答える