-3

友人、私は次のようにポインタ配列からメモリを解放しようとしています:

const gchar *strings[21];
strings[0]  = malloc(strAuth)
strings[0]  = strAuth
....
....
    int j=0;
    while(j < 20){
      if (strlen(strings[j]) != 0) {
    g_free((char*)strings[j]);
    g_print("Cleaned:%d\n",j);
      }
      j++;
      g_print("%d",j);
    }
//g_free((char*)strings);

j は 20 まで出力してから

$ ./mkbib 
Cleaned:0
1Cleaned:1
2Cleaned:2
34Cleaned:4
56789101112Cleaned:12
1314151617181920*** glibc detected *** ./mkbib: malloc(): memory corruption (fast): 0x0000000000a14e10 ***

(C初心者への)説明はありますか?

EDIT 1愚かな情報で申し訳ありませんが、strAuthとは何かを避けていました。これにはgtkライブラリが含まれているためです(clcで特定のライブラリに依存する質問をすることについては悪い経験があります)。したがって、実際のコードは次のようになります。

 strings[0]  = g_malloc(strlen(gtk_entry_get_text(GTK_ENTRY(e->entry1))));
 strings[0]  = gtk_entry_get_text(GTK_ENTRY(e->entry1));

where gtk_entry_get_textis of type const gchar * 最初の投稿で時間を無駄にしてしまったかもしれません。助けてください。

編集2

const gchar *strings[21]; 
strings[0] = g_malloc(strlen(gtk_entry_get_text(GTK_ENTRY(e->entry1)))); 
strings[0] =g_strdup(gtk_entry_get_text(GTK_ENTRY(e->entry1))); 
........
int i=2; 
    while (i < 21) {
      if (strlen(strings[i]) != 0) {
    g_string_append_printf(tstring, ",\n\t%s=\"%s\"",
        keyword[i], strings[i]);
      g_free((char*)strings[i]);
      strings[i]=NULL;
      g_print("Cleaned:%d\n",i);
      } 
      i++;
 }
4

3 に答える 3

0

あなたを助けるためにいくつかのコメントを追加しましょう:

const gchar *strings[21];     // allocate an array of 21 pointers to gchar constants
strings[0]  = malloc(strAuth) // assign some memory (strAuth number of bytes) to the
                              //   first pointer
strings[0]  = strAuth         // reassign the first pointer the value of strAuth

strAuthtoの割り当てを行うstrings[0]と、最初に malloc されたものを上書きします。したがって、strAuth文字列リテラルまたは malloc されていないものがある場合、free の呼び出しは実際に失敗します。動的に割り当てられたものだけを解放できます。

したがって、ポインターを配列内の定数文字列に固定するか (malloc または free しない)、または malloc/free してから文字列を配列にコピーするかを決定する必要があります。

malloc()と組み合わせて呼び出していることに注意してください。それは良い考えではありません。andは単なるラッパーではなく、and and などとして使用する必要があります...疑似コードの説明:g_free() g_malloc()g_free()free()malloc()

if 
    g_malloc(strings[x]) 
  then 
    g_free(strings[x])
else if 
    strings[x] = malloc(y) 
  then 
    free(strings[x])
于 2013-06-11T18:29:18.090 に答える