1

私は機能を持っています:

//In main.c    
char output_entry () {
  extern  FILE* yyin;
  extern int yyparse (void);
  yyin=fmemopen(buffer,strlen(buffer),"r");
  return yyparse();
}

から呼び出されたときに正常に動作します

//Open file
gchar *filename;
void open_file(GtkWidget *widget, gpointer data)
{
  GError* error=NULL;
  GtkWidget *dialog;
  GtkFileFilter *filter;
  dialog = gtk_file_chooser_dialog_new("Open File", NULL,
      GTK_FILE_CHOOSER_ACTION_OPEN,
      GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
      GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
      NULL);
  filter = gtk_file_filter_new();
  gtk_file_filter_set_name(filter, "All files (*.*)");
  gtk_file_filter_add_pattern(filter, "*");
  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);

  filter = gtk_file_filter_new();
  gtk_file_filter_set_name(filter, "Bibtex file (*.bib)");
  gtk_file_filter_add_pattern(filter, "*.bib");
  gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter);
  gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog), filter);

  if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
  {
    gtk_list_store_clear (store);
    filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
    g_file_get_contents(filename, &buffer, &length , &error);
    g_assert(!error);
    buf_mod=FALSE;

    char* markup=g_markup_printf_escaped ("<span style=\"italic\">%s</span>", filename);
    gtk_label_set_markup(GTK_LABEL(flabel), markup);
    gtk_widget_destroy(dialog); 

    output_entry();
  }
  else{
    gtk_widget_destroy(dialog);
//    g_free(buffer);
  }
}

これは、ファイルを開く標準的な方法です。そしてbuffer_

//in main.h
extern gchar *buffer; 

そしてmain.cで初期化されます(ここでアドバイスされているように)

コードのこの部分は正常に動作しています。他のソースでも output_entry を使用しようとしました:

void gs_open(GtkWidget *window, gpointer data) {
  GScanner *gs_scanner;
  GHashTable *gs_table;
  GError* error=NULL;
  GtkTextIter start, end;
  GtkListStore *gs_store;
  GtkTreeIter siter;
  GtkWidget *gs_tree;
  gboolean valid;
  GString *ustring = g_string_new ("");
  GString *str=g_string_new(NULL);

  GtkTextBuffer *gs_buf=gtk_text_view_get_buffer(GTK_TEXT_VIEW(gs_txt));
  gtk_text_buffer_get_start_iter (gs_buf, &start);
  gtk_text_buffer_get_end_iter (gs_buf, &end);
  gchar *gs_text = gtk_text_buffer_get_text (gs_buf, &start, &end, FALSE);
  strcat(buffer, gs_text);
  gtk_list_store_clear(store);
  output_entry ();
  buf_mod=TRUE;
  gtk_widget_destroy(gtk_widget_get_toplevel (window));
}

そして、これによりセグフォルトが発生します。gdb で実行すると、次のように表示されます。

Using host libthread_db library "/lib64/libthread_db.so.1".
[New Thread 0x7ffff16fc700 (LWP 6178)]

Program received signal SIGSEGV, Segmentation fault.
0x0000003b94097261 in __strcat_sse2_unaligned () from /lib64/libc.so.6

親切に助けてください(私はCの初心者です)。そして、Googleはあまり役に立っていませんstrcat_sse2_unaligned

編集2

 up
#1  0x0000000000407195 in gs_open (window=0x863a80, data=<optimized out>)
    at src/search.c:103
103   strcat(buffer, gs_text);
4

3 に答える 3

2

にメモリを割り当てる場所はどこにもありませんbuffer。これは、それがNULLポインターであることを意味します (グローバル変数であるため)。バッファーを使用する前に、バッファーにメモリを割り当てる必要があります。

于 2013-06-12T10:37:25.557 に答える
0

行は次のようstrcatに置き換えられます。

  if (buffer == NULL){
    buffer=g_strdup(gs_text);
  }
  else{
    gchar *t=buffer;
    buffer=g_strconcat(buffer,gs_text,NULL);
    g_free(t);
  }

問題を解決したもの。

コメントお待ちしております。

于 2013-06-12T14:53:08.700 に答える
0

strlen()文字列の長さではなく、バッファのサイズを計算するために使用しようとしていると思います。

0 で終わる有効な文字列が含まれていない場合bufferは、使用できませんstrlen()。有効なメモリからステップアウトする可能性が高く、(最も重要なことに) まったく必要としない結果が生成されます。

おそらく、 が指すバッファのサイズを保持する別の変数が必要です buffer

于 2013-06-12T06:47:08.643 に答える