ข้อผิดพลาดในการแบ่งส่วน - C โดยใช้ malloc

ฉันกำลังพยายามจัดสรรหน่วยความจำสำหรับอาร์เรย์ของพอยน์เตอร์ให้กับวัตถุ ObjectP เป็นตัวชี้ไปยังโครงสร้างที่ชื่อวัตถุ ก่อนฟังก์ชันนั้น ฉันจะประกาศในอาร์เรย์เป็น: ObjectP* array ดังนั้นอาร์เรย์จึงเป็นตัวชี้ไปยังอาร์เรย์ของตัวชี้ไปยังวัตถุ จากนั้นฉันก็ส่ง &array เพื่อที่ฉันจะได้มีตัวชี้ไป สมมติว่า table_size ของฉันคือ 2 ฉันได้รับข้อผิดพลาดในการแบ่งส่วนเมื่อฉันพยายามป้อน *array[1]=NULL อะไรคือปัญหา?

นี่คือรหัสของฉัน:

    void allocateArrayMemory(ObjectP** array,size_t table_size)
    {
    *array=(ObjectP*)malloc(table_size*sizeof(ObjectP));
    int i=0;
    for (i = 0; i < (int)table_size; ++i)
    {
        *array[i]=NULL;
        printf("%d\n",i);
    }
    printf("finished allocating\n");
    if(*array==NULL)
    {
        printf("null\n");
    }

    }

person fgfjhgrjr erjhm    schedule 23.08.2011    source แหล่งที่มา
comment
โปรดแก้ไขคำถามของคุณและปรับการจัดรูปแบบ   -  person Aleks G    schedule 23.08.2011
comment
ลอง (*array)[i]=NULL;   -  person Kerrek SB    schedule 23.08.2011


คำตอบ (1)


รหัส *array[i]=NULL; ทำหน้าที่เหมือน *(array[i])=NULL; และสิ่งที่คุณต้องการคือ (*array)[i]=NULL;

เมื่อ i=1, *(array[i]) จะยกเลิกการอ้างอิง struct Object *** ที่ตามหลัง struct Object *** ที่คุณส่งผ่านไปยังจัดสรร ArrayMemory ในขณะที่ (*array)[i] จะยกเลิกการอ้างอิง struct Object ** ตัวที่สองในพื้นที่หน่วยความจำที่เพิ่ง malloced

หมายเหตุบางประการ:

  1. แก้ไขการสะกดคำว่า 'การแบ่งกลุ่ม' ในชื่อ

  2. ทดสอบผลลัพธ์ของ malloc ก่อนใช้ ในโค้ดของคุณ คุณมีการทดสอบหลังจากใช้ *array; เลื่อนมันขึ้น

  3. ฉันแนะนำให้ใช้ memset(*array, 0, table_size*sizeof(ObjectP)); แทนการวนซ้ำเพื่อเริ่มต้น *array

  4. มันเป็นรูปแบบที่ไม่ดีใน C ที่จะร่ายผลลัพธ์ของ malloc แทนที่จะพูดว่า *array = malloc(table_size*sizeof(ObjectP));

  5. ตามสไตล์ ฉันจะจัดสรร ArrayMemory เป็นฟังก์ชันที่ส่งคืนที่อยู่ของหน่วยความจำที่จัดสรร แทนที่จะส่งผ่านพารามิเตอร์ ตัวอย่างเช่น:

    ObjectP* allocateArrayMemory(size_t table_size) {

    ObjectP *array = malloc(table_size*sizeof(ObjectP));

    ...

    if(array==NULL) { printf ...; return NULL; }

    ...

    for (i=0; i < table_size; ++i)

    {
    

    array[i] = NULL;

    ...

    }
    

    ...

    return array;

และในผู้โทร ObjectP *a; ... a = allocateArrayMemory(6);

person James Waldby - jwpat7    schedule 23.08.2011