stack-overflow与heap-buffer-overflow 等常见执行错误的原因以及改正方法

 我的所有学习笔记(从0到1):GitHub - Dusongg/StudyNotes: C++11-20 、Linux进程/线程/内核设计/网络、进阶算法、java/python语法基础、Git、Mysql

 看完给个star再走吧⭐


目录

前言

一、stack-overflow

1.while、for死循环

2.无限递归导致栈溢出

二、heap-buffer-overflow 

1. 数组越界访问

2. 字符串无结束标志 ' \0 ' 

三、“SEGV” 与 “load of null pointer”

1. 二维数组传参

四、其他 

1. 返回值使用错误​编辑

To be continued


前言

你是否会在写完一整串代码之后提交,发现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

  • 17
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
heap-buffer-overflow是一种错误,通常出现在使用C语言编写代码时。它指的是访问了堆中分配的内存块之外的部分,导致数据越界访问。这种错误可能会导致程序崩溃、数据损坏或者安全漏洞的产生。 在解决heap-buffer-overflow问题时,一般需要以下几个步骤: 1. 首先,需要定位具体出错的位置。可以通过调试工具、代码审查或者日志来追踪错误发生的地方。 2. 确认出错的原因。这可能涉及到对代码的仔细分析,包括内存分配、指针操作等。 3. 修改代码,以确保在访问堆中分配的内存时不会越界。可以通过检查数组边界、指针的有效性来避免这种错误。 4. 进行测试和验证,确保修改后的代码能够正常运行,并且不再出现heap-buffer-overflow错误。 需要注意的是,解决heap-buffer-overflow问题可能会因具体情况而异。每个问题都需要具体分析和处理,确保代码的安全性和正确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Leetcode中解决stack/heap-buffer-overflow错误](https://blog.csdn.net/lijianyi0219/article/details/111510086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [buffer_overflow:缓冲区溢出](https://download.csdn.net/download/weixin_42099633/19247971)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dusong_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值