Mengalokasikan memori ke array string di c

Saya sedang dalam proses membuat tabel hash. Saya menggunakan struct untuk kapasitas, jumlah kunci, frekuensi dan kunci itu sendiri. Ini kode saya untuk menginisialisasi struct:

htable htable_new(int capacity) {

  htable result = emalloc(sizeof *result);
  result->capacity = capacity;
  result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
  result->keys = emalloc(capacity * sizeof result->keys[0]);
  result->frequencies = 0;
  result->keys = NULL;

  return result;
}

Sekarang, dari pemahaman saya, array char** adalah penunjuk ke array pointer (bertipe char)? Jadi ketika saya mengalokasikan memori, apakah benar menggunakan kunci[0]? Saya berasumsi bahwa ini hanya mewakili ukuran pointer char? Yang mengarah ke pertanyaan saya berikutnya tentang kapan saya benar-benar mengatur kunci dalam array (yang jelas ada di fungsi lain) apakah saya akan mengalokasikan memori ke setiap indeks berdasarkan ukuran string yang saya masukkan sebelum menyimpannya?

i.e. h->keys[index] = emalloc(sizeof(str)

Terima kasih atas jawaban Anda!


person Paldan    schedule 24.08.2014    source sumber


Jawaban (1)


Dengan asumsi emalloc adalah makro atau fungsi yang valid,

Panggilannya

result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
result->keys = emalloc(capacity * sizeof result->keys[0]);

baik-baik saja. Namun, dua baris berikutnya:

result->frequencies = 0;
result->keys = NULL;

segera menyebabkan kebocoran memori. Saya tidak tahu mengapa Anda memilikinya. Mereka harus disingkirkan.

Dengan asumsi str bertipe char* atau char const*, baris

h->keys[index] = emalloc(sizeof(str));

tidak akan mengalokasikan jumlah memori yang diperlukan untuk h->key[index]. Itu akan mengalokasikan cukup memori untuk menampung hanya char*. Anda membutuhkan:

h->keys[index] = emalloc(strlen(str)+1);
strcpy(h->keys[index], str);
person R Sahu    schedule 24.08.2014
comment
Hai, terima kasih atas balasan Anda. Saya menggunakan: hasil-›frekuensi = 0; dan hasil-›kunci = NULL; karena saya ingin mengatur semua elemen sama dengan 0 dan NULL. Bagaimana cara saya melakukannya? - person Paldan; 24.08.2014
comment
Anda dapat menggunakan calloc. - person R Sahu; 24.08.2014