-3

下面的代码显示了分段错误。我发现的错误在哪里是它在包含 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;
}
4

2 回答 2

2

文档readline

功能: 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调用中的,并添加了错误检查。

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

于 2012-11-03T19:20:42.017 回答
0

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

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

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

{
    ...
}
于 2012-11-03T19:09:50.930 回答