จัดสรรวัตถุแบบไดนามิก สมาชิกที่ไม่ใช่ ptrs (ไม่ได้จัดสรรแบบไดนามิก) ในโครงสร้างจะอยู่ในสแต็กแทนที่จะเป็นฮีปหรือไม่

บอกว่าฉันมีโครงสร้างนี้:

typedef struct List_object list;
struct List_object {
    char* name;
    struct stat stats;
};

ในหลัก:

list** listObjects = malloc(sizeof(list*) * n);
    for(int i = 0; i < n; i++) {
        listObjects[i] = malloc(sizeof(list));
        listObjects[i]->name = malloc(sizeof(char) * 124);
    }

ถ้าอย่างนั้นฉันก็มีฟังก์ชั่นที่ตั้งค่าไว้:

void setListObjects(char* name, struct stat stats);

ฉันสงสัยว่าสมาชิกข้อมูล struct stat stats ในแต่ละออบเจ็กต์ของอาร์เรย์ listObjects จะอยู่ในฮีปด้วยหรือไม่

หรือจะเป็นเพียง listObjects และสมาชิกข้อมูล ชื่อ เนื่องจากทั้งสองได้รับการจัดสรรด้วย malloc ไม่ใช่ สถิติ


person Community    schedule 28.08.2020    source แหล่งที่มา
comment
หน่วยความจำที่จัดสรรแบบไดนามิกทั้งหมดจะอยู่ในฮีป   -  person Jonathan Leffler    schedule 28.08.2020
comment
@JonathanLeffler เนื่องจากฉันไม่ได้จัดสรรสถิติสถิติ struct แบบไดนามิกและตั้งค่าหนึ่งในองค์ประกอบ listObjects ให้เป็น tha, listObjects[i]-›stats = stats ภายในฟังก์ชัน: setListObjects(char* name, struct stat stats) จะ listObjects [i]->สถิติอยู่ในสแต็กเท่านั้นเหรอ?   -  person    schedule 28.08.2020
comment
ด้วย list** listObjects = malloc(sizeof(list) * n); คุณสร้างบางสิ่งที่เป็นตัวชี้ให้กับ list และกำหนดให้กับตัวชี้ให้กับตัวชี้ไปที่ list ขนาดไม่ตรงกัน คุณหมายถึง list** listObjects = malloc(sizeof(list*) * n);ใช่ไหม?   -  person Yunnosch    schedule 28.08.2020
comment
ไม่มีสิ่งที่เรียกว่า stack และ heap ในภาษา C คำเหล่านี้ไม่ปรากฏในข้อความของมาตรฐาน การใช้งานของคุณอาจใช้สแต็กและ/หรือฮีปเพื่อใช้งานภาษา แต่สิ่งเหล่านี้เป็นเพียงรายละเอียดการใช้งาน   -  person n. 1.8e9-where's-my-share m.    schedule 28.08.2020


คำตอบ (1)


ฉันสงสัยว่า data member struct stat stats ในแต่ละอ็อบเจ็กต์ของ listObjects อาร์เรย์จะอยู่ในฮีปด้วยหรือไม่

ใช่. สมาชิก struct ทุกคนจะถูกจัดสรรบนฮีป แม้ว่าโปรดทราบว่าแม้ว่าตัวชี้ name ในตัวอย่างของคุณจะถูกจัดสรรพร้อมกับโครงสร้างบนฮีป แต่สิ่งที่ชี้ไปอาจเป็นอะไรก็ได้

person Lundin    schedule 28.08.2020