代码显示分段错误

时间:2012-11-03 18:56:58

标签: c++

以下代码显示了分段错误。我所知道的错误就是它在包含printf()语句的行中,但不确定它为什么以及如何纠正它。任何人都可以帮助我...

#include<iostream>
#include<stdio.h>
#include<string>
#include<readline/history.h>
#include<readline/readline.h>

using namespace std;
int main()
{
    using_history();
    string command("history");
    add_history(command.c_str());
if (command == "history")
{
    cout<< "hello\n";
    for(int i = 0 ; i < history_length ; i++)
    {
        cout<<"in there\n";
        HIST_ENTRY *entry = history_get(i);
        cout<<"till here\n";
        printf("%5d %s", i , entry->line);
    }
}
return 0;
}

2 个答案:

答案 0 :(得分:2)

来自the readline documentation

  

功能: HIST_ENTRY * history_get (int offset)
  从offset开始,返回位置history_base的历史记录条目(请参阅2.4历史记录变量一节)。如果那里没有条目,或者offset大于历史记录长度,则返回NULL指针。

您的代码会忽略history_base并忽略0。

因此,history_get无法成功并返回您的代码未检查的NULL指针。尝试取消引用此指针会导致分段错误。

我会像这样编写循环:

for (int i = 0; i < history_length; i++) {
    HIST_ENTRY* entry = history_get(history_base + i);
    if (entry)
       printf("%5d %s", i, entry->line);
    else
       printf("%5d ERROR!", i);
}

请注意我已将history_base偏移量添加到history_get调用中,并添加了错误检查。

阅读您使用的函数的文档,执行错误检查和使用调试器是关键编程人才!

答案 1 :(得分:0)

history_get(offset);的偏移参数从history_base开始。此外,history_length是历史记录中的条目总数,因此您必须在循环条件中添加history_base

这意味着您应该按以下方式重写循环:

for(int i = history_base ; i < history_base + history_length ; i++)

{
    ...
}