前言
如题所示,本菜狗是ME转专业ing的程序猿,犹记得大二那年C语言的学习让我兴奋不已并一举拿下全班最高分,却未曾有勇气踏出专业半步,如今也算了却心愿,自当奋进努力。
本人的基础和各位大佬比起来可谓天地之别,但仍怀一颗上进之心,望能步大佬后尘也是好的。
在此写下个人学习的一点心得,望大家多多喷我,让我明白我的“菜点”的同时,也能让其他小白看到后少犯错误。前路漫漫,相互陪伴。
第一期——Leetcode 45 error
在我重温C语言之后,并自学数据结构过程之中,我打开了Leetcode大门……
Tips:这里建议刚刚入门的同学像我一样,从leetcode的「探索」专题开始做起(在首页最上面菜单栏),探索专题分成一个个小知识模块并附带几道难度低/中的算法题,小怪们有强有弱,算是新手村的Boss。
本次重点想说的,可能是新手们入门最常遇到的一个报错,heap-buffer-overfolw——堆溢出。
其实,不只是堆,报错有着各种各样的溢出,同类下常见的几种报错有且不局限于如下几种:
Tips:本期重点聚焦heap buffer overflow,关于以上其他类别的常见错误及其解决方法均在CSDN上《【C语言刷LeetCode】Address Sanitizer 常见报错》(作者kinbo88)的文章里介绍了。
而我重点要说的是,如果你检查、修正了上述文章里的情况后,依旧有用力无法通过,该怎么办?
结论
这里先告诉大家结论:检查你指针指向数组的应用是否多余。
具体问题具体分析
我遇到堆溢出是在“零矩阵”问题下,题目如下图所示:
这里附上我的代码:
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int a[64];
int b[64];
int i,j,m=0,n=0;
int u,v;
for (i=0;i<matrixSize;i++){ //扫描行
for(j=0;j<*matrixColSize;j++){ //扫描列
if (matrix[i][j]==0){ //如果发现该元素为0,将其坐标存储
a[m]=*matrix[i];
m++;
b[n]=*matrix[j];
n++;
}
}
}
//所有0所在列元素置零
for (u=0;u<m;u++){
for (j=0;j<*matrixColSize;j++){
matrix[a[u]][j]=0;
}
}
//所有0所在行元素置零
for (v=0;v<n;v++){
for (i=0;i<matrixSize;i++){
matrix [i][b[v]]=0;
}
}
return matrix;
}
我想根据上面的注释,各位应该看的八九不离十,这里只说一下我之所以在判断0元素后将该元素的坐标i和j分开来存是因为:
其一,矩阵并不总是方阵,分开来存调用方便;
其二,二维数组我不熟,嘿嘿。后面matrix置零步骤下,二维数组就麻烦了。
眼尖的小伙伴可能已经看到了,问题就出在将0元素坐标存储的过程里:
a[m]=*matrix[i];
m++;
b[n]=*matrix[j];
n++;
思路是对的,BUT!要存储的是i和j本身的值,像我这么干,存储的就是matrix矩阵第i行和第j行的元素了。
是不是觉得挺弱智的问题?
但真的陷入自己的怪圈,很难去发现这个问题(屁,只是我菜罢了)。
修改之后,果然神清气爽,用例OK,接下来还有一个需要注意的问题是如下报错:
问题症结
到这里的报错就应该知道了,如果真的是因为数组溢出导致提交失败,报错应该是这个才对。
而之前的报错“----45----ERROR……”根本不是你定义出问题,而是程序内部使用出了问题。
这里不得不感叹用例是真的多,元素也是真的多,于是作出如下修改:
int a[1000];
int b[1000];
如此这般,就美滋滋的提交吧~~