在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语句循环条件写反导致访问越界了。