การเริ่มต้นและการจัดการการจัดสรรหน่วยความจำ C

มีปัญหากับงานของฉันที่นี่ ฉันต้องสร้างบล็อกหน่วยความจำว่างส่วนกลางและ malloc มัน มีปัญหาในการเริ่มต้นเนื่องจากข้อผิดพลาดของ typecast และการจัดการ

เช่นเดียวกับอาร์เรย์ในภาษา C โดยที่อาร์เรย์แรกเป็นตัวชี้ไปยังองค์ประกอบแรก บล็อกหน่วยความจำของฉันต้องคล้ายกันโดยที่ฉันสามารถใช้เลขคณิตของพอยน์เตอร์เพื่อค้นหาบล็อกของหน่วยความจำ

//global variable
static byte *memory = NULL;

void allocator_init(u_int32_t size){

     *memory = (byte*) malloc(size);
}

ที่อยู่/ตัวชี้ไปยังที่อยู่หน่วยความจำเหล่านี้จะถูกจัดเก็บผ่านโครงสร้าง/ลิงก์เป็นส่วนหัวของบล็อกหน่วยความจำ

typedef struct _header {
    int signiture;
    int size;
    header* next;
    header* prev;
} header;

person ryantata    schedule 17.08.2012    source แหล่งที่มา
comment
หากคุณรวมส่วนหัว <stdlib.h> ไว้ การร่ายจะซ้ำซ้อน หากคุณไม่ได้นักแสดงจะซ่อนจุดบกพร่องที่น่ารังเกียจ ... หรือคุณจะดีกว่าถ้าไม่มีนักแสดงไม่ว่าคุณจะรวมส่วนหัวที่เหมาะสม :)   -  person pmg    schedule 17.08.2012
comment
ฉันทำแล้ว มันรวมอยู่ที่ด้านบน   -  person ryantata    schedule 17.08.2012


คำตอบ (4)


วาง *:

*memory = (byte*) malloc(size);
^

คุณอาจต้องการยกเลิกการแสดง แต่นั่นเป็นหน้าที่ของคุณ

person cnicutar    schedule 17.08.2012
comment
คุณอาจต้องการยกเลิกการแสดง แต่นั่นเป็นหน้าที่ของคุณ - ถ้าเป็น C++ ก็ไม่ใช่ หากเป็น C ก็ไม่ใช่: stackoverflow.com/questions/605845/ - person ; 17.08.2012
comment
@ H2CO3 ฉันเคยอ่านโพสต์โดยผู้ใช้ SO ที่มีชื่อเสียงซึ่งกล่าวว่ามีข้อดีและข้อเสียในการคัดเลือกผลลัพธ์ของ malloc ใน C - person cnicutar; 17.08.2012
comment
@ H2CO3 ไม่แน่นอน ฉันจำไม่ได้ว่าเป็นใคร หรือฉันจะตั้งชื่อเขา/เธอ - person cnicutar; 17.08.2012
comment
ถ้าอย่างนั้นฉันก็ไม่เถียง :) (เอาจริง ๆ มันทำให้โค้ดอ่านไม่ได้และเกิดข้อผิดพลาดได้ง่ายในกรณีที่คุณลืมใส่ stdlib.h...) - person ; 17.08.2012
comment
@ H2CO3 ฉันไม่แคสต์เหมือนกัน แต่ฉันไม่แนะนำให้คนอื่นทำเช่นเดียวกันโดยตรง - person cnicutar; 17.08.2012
comment
หากคุณต้องการการหล่อพอยน์เตอร์ อาจเป็นเพราะคุณไม่ได้คอมไพล์ C (แต่เป็น C++) - person pmg; 17.08.2012

คุณต้องกำหนดค่าที่ส่งคืนของ malloc ให้กับตัวชี้เอง ไม่ใช่ให้กับไบต์ที่ตัวชี้ชี้ไป (อย่างไรก็ตาม หากคุณยกเลิกการอ้างอิงตัวชี้ NULL ในตอนแรก โปรแกรมของคุณจะแยกส่วน)

memory = malloc(size);

นอกจากนี้อย่าคำนึงถึงค่าส่งคืนของ malloc

person Community    schedule 17.08.2012

*memory = (byte*) malloc(size); - คำสั่งนี้หมายความว่าคุณกำลังพยายามกำหนดที่อยู่ของบล็อกหน่วยความจำฮีปเป็นค่าให้กับ *memory ที่นี่ memory กำลังมี NULL ดังนั้นมันจะพัง

คุณต้องกำหนดที่อยู่ให้กับตัวแปรเช่น memory = (byte*) malloc(size);

person rashok    schedule 17.08.2012
comment
ดังนั้น global static จะดูแลการกำหนดหน่วยความจำตัวแปรเพื่อใช้เป็นตัวชี้หรือไม่? - person ryantata; 17.08.2012
comment
ไม่ คุณต้องกำหนดแอดเดรสที่ส่งคืนด้วย malloc ให้กับตัวแปร memory เท่านั้น แม้ว่าจะเป็นตัวแปรโลคัลก็ตาม - person rashok; 17.08.2012

ในโครงสร้างส่วนหัวของคุณ เนื่องจากโครงสร้างอ้างอิงถึงตัวเอง ให้ประกาศตัวชี้ส่วนหัวภายในเป็น "struct _header * name;" ฉันคิดว่าคนอื่นได้ตีจุดอื่นทั้งหมดแล้ว :)

person Neil    schedule 17.08.2012