菜狗求教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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
希望大家帮我解答一下,,谢谢。
. 是不是编译器的事?用的什么编译器,换个编译器试试 你的第二份代码那的for循环那有个=,是不是这个原因。我上次就是加个=就报错,堆栈啥的错误,去掉=就不报错 磊磊映画 发表于 2021-3-3 16:57
是不是编译器的事?用的什么编译器,换个编译器试试
不是编译器的问题,在VS上 或者Clion上的GCC都报错 爱晴海玩偶 发表于 2021-3-3 17:08
你的第二份代码那的for循环那有个=,是不是这个原因。我上次就是加个=就报错,堆栈啥的错误,去掉=就不报错 ...
应该不是,注意一下范围就好了,写成<=或者<无所谓的。 什么报警 LZ用的什么编译器? 既然是新手, 建议就是压根不要写二维数组
需要用到二维数组的地方用一维, 然后下标自己乘一下 人家代码分配空间的时候也是按数组类型分配的,你的代码二级指针都不知道指向的数组类型是什么就直接下标访问。 本帖最后由 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
具体有什么错误信息?粘贴上来才能帮你判断。
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[]。这两个指针类型根本不兼容。 takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a,对应的指针是int (*pa), ...
是的,是运行时出错。
这里二维数组强制转换为二级指针使用是有错误的。
但是在代码3中,是力扣给出的官方代码,他的matrix是直接当成二级指针进行访问的。
相同的使用方法,我的就会运行时错误。官方代码就没事,这是我纠结的地方。。。
. takashiki 发表于 2021-3-6 06:03
他贴出来的代码编译应该是没有问题的,但运行时很有问题。比如int a,对应的指针是int (*pa), ...
原来如此,我以为只是编译问题,就没有细看算法了。你说的对,的确是有类型不符的问题。
页:
[1]