菜狗求教C语言中,二维数组做参数,退化为二级指针的问题。
5419
2021.03.03
发布于 未知归属地

直接上代码吧
我自己写的时候,总是报错,但是看别人写的就能通过。
这个问题一直困扰着我,实在不明白,望大家指教。

typedef struct {
    int** mat;
    int matSize;
    int matColSize;
} NumMatrix;
NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) {
    int i,j;
    NumMatrix* obj;

    if((NULL == matrix) || (NULL == matrix[0]) || (NULL == matrixColSize))
    {
        return NULL;
    }

    printf("%p\n", matrix);

    obj = (NumMatrix*)malloc(sizeof(NumMatrix));

    obj->matSize = matrixSize;
    obj->matColSize = matrixColSize[0];

    obj->mat = (int**)malloc(sizeof(int*) * (matrixSize+1));

    for(i=0; i<matrixSize; i++)
    {
        obj->mat[i] = (int*)malloc(sizeof(int) * (matrixColSize[0]+1));
        memcpy(obj->mat[i], matrix[i], matrixColSize[0]);// <<< 出错行
    }

    return obj;
}

也就是说使用 matrix[i] 去访问二维指针,会报错。
还有,我访问 matrix[i][j] 的时候,也会报错。如下:

bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
    int i,j;
	
	if (matrix == NULL || matrixSize == 0 || matrixColSize[0] == 0) {
		return false;
	}

	
    for(i=1; i<=matrixColSize[0]; i++)
    {
        if( matrix[0][matrixColSize[0]-i] < target) //<<<这行matrix[i][j]出错
        {
            //得到目标列
            break;
        }
        if( matrix[0][matrixColSize[0]-i] == target)
        {
            return true;
        }
        
    }
    if(matrixColSize[0] == i)
    {
        return false;
    }

    for(j=1; j<=matrixSize-1; j++)
    {
        if(matrix[j][matrixColSize[0]-i] == target)
        {
            return true;
        }
    }

    return false;
}

但是我看别人,包括官方的回答,都是直接 matrix[i][j] 访问的呀,他们不报错,合着就我自己报错啊。。。。

下边是官方写的代码:

NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) {
    NumMatrix* ret = malloc(sizeof(NumMatrix));
    ret->sums = malloc(sizeof(int*) * matrixSize);
    ret->sumsSize = matrixSize;
    for (int i = 0; i < matrixSize; i++) {
        ret->sums[i] = malloc(sizeof(int) * (matrixColSize[i] + 1));
        ret->sums[i][0] = 0;
        for (int j = 0; j < matrixColSize[i]; j++) {
            ret->sums[i][j + 1] = ret->sums[i][j] + matrix[i][j];//<<<这行matrix[i][j]不出错!??
        }
    }
    return ret;
}
/*
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/solution/er-wei-qu-yu-he-jian-suo-ju-zhen-bu-ke-b-2z5n/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

希望大家帮我解答一下,,谢谢。

评论 (15)