C++ &引用;gtk“文本”缓冲区“获取边界”;功能导致SEGFAULT

C++ &引用;gtk“文本”缓冲区“获取边界”;功能导致SEGFAULT,c++,iterator,segmentation-fault,gtk,gtk3,C++,Iterator,Segmentation Fault,Gtk,Gtk3,我正在编写一个GTK应用程序,其中需要将一个字符串放入GtkTextBuffer,然后稍后将相同的文本提取回一个单独的字符串。出于某种原因,我在“gtk_text_buffer_get_bounds”函数期间不断收到SEGFAULT错误。我认为“e”迭代器有问题,但我不确定 我已将违规操作隔离到一个较小的示例程序中。下面的流程与我的应用程序中的流程没有区别 我做错了什么 #include <iostream> #include <gtk/gtk.h> int main (

我正在编写一个GTK应用程序,其中需要将一个字符串放入GtkTextBuffer,然后稍后将相同的文本提取回一个单独的字符串。出于某种原因,我在“gtk_text_buffer_get_bounds”函数期间不断收到SEGFAULT错误。我认为“e”迭代器有问题,但我不确定

我已将违规操作隔离到一个较小的示例程序中。下面的流程与我的应用程序中的流程没有区别

我做错了什么

#include <iostream>
#include <gtk/gtk.h>
int main ()
{
  const char *string1 = "hello\0", *string2;
  GtkTextBuffer *text = gtk_text_buffer_new (NULL);
  GtkTextIter *s, *e;

  gtk_text_buffer_set_text (text, string1, -1);
  gtk_text_buffer_get_bounds (text, s, e);
  string2 = gtk_text_buffer_get_text (text, s, e, TRUE);
  std::cout << string2 << std::endl;
  return 0;
}
#包括
#包括
int main()
{
const char*string1=“hello\0”,*string2;
GtkTextBuffer*text=gtk_text_buffer_new(空);
GtkTextIter*s,*e;
gtk_text_buffer_set_text(text,string1,-1);
gtk_text_buffer_get_界限(text,s,e);
string2=gtk_text_buffer_get_text(text,s,e,TRUE);

std::cout您将
s
e
声明为指针,它们将默认初始化为
nullptr
,因此当
gtk_text_buffer_get_bounds
gtk_text_buffer_get_text
使用它们时,您将得到一个空指针解引用和一个segfault:

GtkTextIter *s, *e;
...
gtk_text_buffer_get_bounds (text, s, e);
...
string2 = gtk_text_buffer_get_text (text, s, e, TRUE);
相反,您可以只分配堆栈上的
GtkTextIter
对象,并传递它们的地址:

GtkTextIter s, e;
...
gtk_text_buffer_get_bounds (text, &s, &e);
...
string2 = gtk_text_buffer_get_text (text, &s, &e, TRUE);

您将
s
e
声明为指针,它们将默认初始化为
nullptr
,因此当
gtk_text_buffer_get_bounds
gtk_text_buffer_get_text
开始使用它们时,您将得到一个空指针解引用和一个segfault:

GtkTextIter *s, *e;
...
gtk_text_buffer_get_bounds (text, s, e);
...
string2 = gtk_text_buffer_get_text (text, s, e, TRUE);
相反,您可以只分配堆栈上的
GtkTextIter
对象,并传递它们的地址:

GtkTextIter s, e;
...
gtk_text_buffer_get_bounds (text, &s, &e);
...
string2 = gtk_text_buffer_get_text (text, &s, &e, TRUE);