以下代码显示了分段错误。我所知道的错误就是它在包含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;
}
答案 0 :(得分:2)
功能:
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++)
{
...
}