การจัดสรรหน่วยความจำให้กับอาร์เรย์ของสตริงใน c

ฉันกำลังดำเนินการสร้างตารางแฮช ฉันใช้โครงสร้างสำหรับความจุ จำนวนคีย์ ความถี่ และตัวคีย์เอง นี่คือรหัสของฉันสำหรับการเริ่มต้น 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;
}

ตอนนี้จากความเข้าใจของฉัน char** array เป็นตัวชี้ไปยังอาร์เรย์ของพอยน์เตอร์ (ประเภท char)? ดังนั้นเมื่อฉันจัดสรรหน่วยความจำ การใช้คีย์[0]จะถูกต้องหรือไม่ ฉันคิดว่านี่เป็นเพียงขนาดของตัวชี้ถ่านใช่ไหม ซึ่งนำไปสู่คำถามต่อไปของฉันว่าเมื่อใดที่ฉันตั้งค่าคีย์ในอาร์เรย์ (ซึ่งเห็นได้ชัดว่าอยู่ในฟังก์ชันอื่น) ฉันจะจัดสรรหน่วยความจำให้กับแต่ละดัชนีตามขนาดของสตริงที่ฉันป้อนก่อนจัดเก็บหรือไม่

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

ขอบคุณสำหรับคำตอบของคุณ!


person Paldan    schedule 24.08.2014    source แหล่งที่มา


คำตอบ (1)


สมมติว่า emalloc เป็นมาโครหรือฟังก์ชันที่ถูกต้อง

การโทร

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

ไม่เป็นไร อย่างไรก็ตาม สองบรรทัดถัดไป:

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

ทำให้หน่วยความจำรั่วทันที ฉันไม่รู้ว่าทำไมคุณถึงมีพวกเขา ควรลบออก

สมมติว่า str เป็นประเภท char* หรือ char const* บรรทัด

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

จะไม่จัดสรรหน่วยความจำที่จำเป็นสำหรับ h->key[index] ที่จะจัดสรรหน่วยความจำให้เพียงพอเพื่อเก็บเฉพาะ char* คุณต้องการ:

h->keys[index] = emalloc(strlen(str)+1);
strcpy(h->keys[index], str);
person R Sahu    schedule 24.08.2014
comment
เฮ้ขอบคุณสำหรับการตอบกลับของคุณที่ฉันใช้: result-›frequencies = 0; และผลลัพธ์ -> คีย์ = NULL; เพราะฉันต้องการตั้งค่าองค์ประกอบทั้งหมดให้เท่ากับ 0 และ NULL ตามลำดับ ฉันจะไปเกี่ยวกับเรื่องนั้นได้อย่างไร? - person Paldan; 24.08.2014
comment
คุณสามารถใช้ calloc - person R Sahu; 24.08.2014