WM_CH 发表于 2021-3-3 16:13:09

菜狗求教C语言中,二维数组做参数,退化为二级指针的问题。

本帖最后由 WM_CH 于 2021-3-3 16:17 编辑

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

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) || (NULL == matrixColSize))
    {
      return NULL;
    }

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

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

    obj->matSize = matrixSize;
    obj->matColSize = matrixColSize;

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

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

    return obj;
}

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

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

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

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

    return false;
}



但是我看别人,包括官方的回答,都是直接 matrix 访问的呀,他们不报错,合着就我自己报错啊。。。。
下边是官方写的代码:


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 = malloc(sizeof(int) * (matrixColSize + 1));
      ret->sums = 0;
      for (int j = 0; j < matrixColSize; j++) {
            ret->sums = ret->sums + matrix;///////////////////////////////这行matrix不出错!??
      }
    }
    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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/



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













.

磊磊映画 发表于 2021-3-3 16:57:01

是不是编译器的事?用的什么编译器,换个编译器试试

爱晴海玩偶 发表于 2021-3-3 17:08:26

你的第二份代码那的for循环那有个=,是不是这个原因。我上次就是加个=就报错,堆栈啥的错误,去掉=就不报错

WM_CH 发表于 2021-3-3 17:40:17

磊磊映画 发表于 2021-3-3 16:57
是不是编译器的事?用的什么编译器,换个编译器试试

不是编译器的问题,在VS上 或者Clion上的GCC都报错

WM_CH 发表于 2021-3-3 17:41:45

爱晴海玩偶 发表于 2021-3-3 17:08
你的第二份代码那的for循环那有个=,是不是这个原因。我上次就是加个=就报错,堆栈啥的错误,去掉=就不报错 ...

应该不是,注意一下范围就好了,写成<=或者<无所谓的。

ztrx 发表于 2021-3-3 18:12:25

什么报警      

laujc 发表于 2021-3-3 21:17:33

LZ用的什么编译器?

tomzbj 发表于 2021-3-4 14:58:19

既然是新手, 建议就是压根不要写二维数组
需要用到二维数组的地方用一维, 然后下标自己乘一下

liyang121316 发表于 2021-3-4 16:22:08

人家代码分配空间的时候也是按数组类型分配的,你的代码二级指针都不知道指向的数组类型是什么就直接下标访问。

Gorgon_Meducer 发表于 2021-3-5 22:23:40

本帖最后由 Gorgon_Meducer 于 2021-3-5 22:29 编辑

我在 clang(Arm Compiler 6)编译都没有问题,只有少数warning而已。

main.c(382): warning: format specifies type 'void *' but the argument has type 'int **' [-Wformat-pedantic]
    printf("%p\n", matrix);
            ~~   ^~~~~~
C:\Keil_v5\ARM\ARMCompiler6.16\Bin\..\include\stdbool.h(15): note: expanded from macro 'bool'
    #define bool _Bool


具体有什么错误信息?粘贴上来才能帮你判断。

takashiki 发表于 2021-3-6 06:03:36

Gorgon_Meducer 发表于 2021-3-5 22:23
我在 clang(Arm Compiler 6)编译都没有问题,只有少数warning而已。

main.c(382): warning: format spec ...

他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a,对应的指针是int (*pa),现在他要强制变成int **ppa,int **ppa对应的数组是int* pa[]。这两个指针类型根本不兼容。

WM_CH 发表于 2021-3-8 17:32:26

takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a,对应的指针是int (*pa), ...

是的,是运行时出错。
这里二维数组强制转换为二级指针使用是有错误的。
但是在代码3中,是力扣给出的官方代码,他的matrix是直接当成二级指针进行访问的。

相同的使用方法,我的就会运行时错误。官方代码就没事,这是我纠结的地方。。。





.

Gorgon_Meducer 发表于 2021-3-21 07:39:14

takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a,对应的指针是int (*pa), ...

原来如此,我以为只是编译问题,就没有细看算法了。你说的对,的确是有类型不符的问题。
页: [1]
查看完整版本: 菜狗求教C语言中,二维数组做参数,退化为二级指针的问题。