使用GDB调试segment fault

在Linux下编写C/C++程序,经常会遇到segment fault的错误。

segment fault错误##

segment fault出现有下列原因:

  • 坏指针错误 :在指针赋值之前就用它来引用内存
  • 改写错误 :越过数组边界写入数据,在动态分配的内存空间以外写入数据,或改写一些堆管理数据结构
  • 指针释放引起的错误 :释放同一块内存两次,或释放一块未曾使用 malloc 分类的内存,或释放一个无效的指针

GDB调试

g++编译时加入-g选项指明在编译的时候,产生调试信息。

g++ -g -std=c++11 3SumClosest.cpp -o 3SumClosest

编译完成后输入

gdb 3SumClosest

开始调试,

首先输入 run 运行整个程序

输入图片说明

发现程序产生 received signal SIGSEGV, Segmentation fault 错误。

这时跟踪错误,输入

backtrace(= bt)

输入图片说明

可以得出错误出现在 3SumClosest.cpp:18,即第18行的错误。

查看详情

frame 1

输入图片说明

这样就定位到了问题。

class Solution
{
public:
	int twoSumClosest(vector<int>& nums, int start, int target)
	{
		int sum_min = 100000;
		for(int i=start+1; i++; i<nums.size()-1)
		{
			for(int j=i+1; j++; j<nums.size())
			{
				if( abs(nums[i] + nums[j] - target) < sum_min)
					sum_min = nums[i] + nums[j];
			}
		}

		return sum_min;
	}
}

问题具体是因为for语句循环条件写反导致访问越界了。

转载于:https://my.oschina.net/lvyi/blog/515345

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值