“ gtk_text_buffer_get_bounds”函数导致SEGFAULT

时间:2019-04-03 20:56:17

标签: c++ iterator segmentation-fault gtk gtk3

我正在编写一个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;
}

1 个答案:

答案 0 :(得分:2)

您将se声明为指针,并且它们将默认初始化为nullptr,因此当gtk_text_buffer_get_boundsgtk_text_buffer_get_text出现时使用它们,您将获得空指针取消引用和段错误:

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);