stack-overflow与heap-buffer-overflow 等常见执行错误的原因以及改正方法
你是否会在写完一整串代码之后提交,发现leetcode报错了一大堆看不懂的英文呢?最后在代码中找大半天bug,学会总结会让你少走很多弯路!对照你的报错信息,在简单的例子中找出你的错误吧。
我的所有学习笔记(从0到1):GitHub - Dusongg/StudyNotes: C++11-20 、Linux进程/线程/内核设计/网络、进阶算法、java/python语法基础、Git、Mysql
看完给个star再走吧⭐
目录
三、“SEGV” 与 “load of null pointer”
前言
你是否会在写完一整串代码之后提交,发现leetcode报错了一大堆看不懂的英文呢?最后在代码中找大半天bug,学会总结会让你少走很多弯路!
对照你的报错信息,在简单的例子中找出你的错误吧。
一、stack-overflow
栈溢出:
1.while、for死循环
① 在循环体中更改了循环变量(i)的值,导致循环无法正常结束
② 循环条件错误
int i = 0;
while (i = 0) { //你可能想的是当i等于10时进入循环
printf("%d", i);
i++;
}
上述例子中你可能想要的判断条件为 i == 0,但是写成了将0赋值给了i,赋值表达式的返回值为true,所以while会死循环,看似很弱智的错误,在写代码的过程中有时一分心就写错了。
2.无限递归导致栈溢出
二、heap-buffer-overflow
堆缓冲区溢出:
1. 数组越界访问
你可能也会在做题中经常遇到这样的一大串报错,是因为你没有很好的防越界的意识!双指针、动态规划、回溯等题中
当你在循环中用一个变量指向数组的一个位置时,你应对该变量的返回设置范围限制;
eg.
while (i < arrSize && arr[i] == 0) {
;
}
2. 字符串无结束标志 ' \0 '
或许你想malloc一个动态内存存储字符串,但是字符串需要一个结束标志 ' \0 ' ,表示字符串的读取结束,解决方法很简单:
char* str = (char*)malloc(sizeof(char) * (strSize + 1));
//.
//操作str
//.
str[strSize] = '\0';
或者你可以用calloc开辟空间,在之前文章讲解过,calloc开辟空间后对对其初始化为0,而 ' \0 '的ASCII值就是0,所以自然就可以解决上述问题了
char* str = (char*)calloc((strSize+1),sizeof(char);
//.
//操作str
//.
三、“SEGV” 与 “load of null pointer”
1. 二维数组传参
这个问题实在我做深搜的题时遇见的,二维函数传参类型并不是 int **, 所以不能用二级指针接收,目前我认为最好的解决方法就是用二维数组接收
int Row;
int Col;
void test(int arr[Row][Col]) {
}
int main() {
Row = 5;
Col = 5;
int used[Row][Col];
memset(used, 0, sizeof(used));
test(used);
return 0;
}
四、其他
1. 返回值使用错误
具体案例:
int** res = (int**)malloc(sizeof(int*)*peopleSize);
*returnSize = 0;
for (struct listNode* p = phead->next; p != NULL; p = p->next) {
res[*returnSize++] = p->people;
/*正确写法:
res[(*returnSize)++] = p->people;*/
}
*returnColumnSizes = peopleColSize;
return res;
To be continued
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)