搜索
bottom↓
回复: 12
打印 上一主题 下一主题

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

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2021-3-3 16:13:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 WM_CH 于 2021-3-3 16:17 编辑

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

  1. typedef struct {
  2.     int** mat;
  3.     int matSize;
  4.     int matColSize;
  5. } NumMatrix;
  6. NumMatrix* numMatrixCreate(int** matrix, int matrixSize, int* matrixColSize) {
  7.     int i,j;
  8.     NumMatrix* obj;

  9.     if((NULL == matrix) || (NULL == matrix[0]) || (NULL == matrixColSize))
  10.     {
  11.         return NULL;
  12.     }

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

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

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

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

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

  23.     return obj;
  24. }
复制代码


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

  1. bool findNumberIn2DArray(int** matrix, int matrixSize, int* matrixColSize, int target){
  2.     int i,j;
  3.        
  4.         if (matrix == NULL || matrixSize == 0 || matrixColSize[0] == 0) {
  5.                 return false;
  6.         }

  7.        
  8.     for(i=1; i<=matrixColSize[0]; i++)
  9.     {
  10.         if( matrix[0][matrixColSize[0]-i] < target) ////////////////////////////////<<<这行matrix[i][j]出错
  11.         {
  12.             //得到目标列
  13.             break;
  14.         }
  15.         if( matrix[0][matrixColSize[0]-i] == target)
  16.         {
  17.             return true;
  18.         }
  19.         
  20.     }
  21.     if(matrixColSize[0] == i)
  22.     {
  23.         return false;
  24.     }

  25.     for(j=1; j<=matrixSize-1; j++)
  26.     {
  27.         if(matrix[j][matrixColSize[0]-i] == target)
  28.         {
  29.             return true;
  30.         }
  31.     }

  32.     return false;
  33. }
复制代码



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


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




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













.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2021-3-3 16:57:01 | 只看该作者
是不是编译器的事?用的什么编译器,换个编译器试试

出0入0汤圆

3
发表于 2021-3-3 17:08:26 | 只看该作者
你的第二份代码那的for循环那有个=,是不是这个原因。我上次就是加个=就报错,堆栈啥的错误,去掉=就不报错

出0入0汤圆

4
 楼主| 发表于 2021-3-3 17:40:17 | 只看该作者
磊磊映画 发表于 2021-3-3 16:57
是不是编译器的事?用的什么编译器,换个编译器试试

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

出0入0汤圆

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

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

出0入4汤圆

6
发表于 2021-3-3 18:12:25 | 只看该作者
什么报警        

出0入4汤圆

7
发表于 2021-3-3 21:17:33 | 只看该作者
LZ用的什么编译器?

出0入362汤圆

8
发表于 2021-3-4 14:58:19 | 只看该作者
既然是新手, 建议就是压根不要写二维数组
需要用到二维数组的地方用一维, 然后下标自己乘一下

出0入42汤圆

9
发表于 2021-3-4 16:22:08 | 只看该作者
人家代码分配空间的时候也是按数组类型分配的,你的代码二级指针都不知道指向的数组类型是什么就直接下标访问。

出0入296汤圆

10
发表于 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



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

出0入93汤圆

11
发表于 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[3][3],对应的指针是int (*pa)[3],现在他要强制变成int **ppa,int **ppa对应的数组是int* pa[]。这两个指针类型根本不兼容。

出0入0汤圆

12
 楼主| 发表于 2021-3-8 17:32:26 | 只看该作者
takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a[3][3],对应的指针是int (*pa)[3], ...

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

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





.

出0入296汤圆

13
发表于 2021-3-21 07:39:14 | 只看该作者
takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a[3][3],对应的指针是int (*pa)[3], ...

原来如此,我以为只是编译问题,就没有细看算法了。你说的对,的确是有类型不符的问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-17 22:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表