Kesalahan Segmentasi - C menggunakan malloc

Saya mencoba mengalokasikan memori untuk array pointer ke objek. ObjectP adalah pointer ke struct bernama Object. sebelum fungsi itu, saya mendeklarasikan array sebagai: array ObjectP*. Jadi array adalah penunjuk ke array penunjuk ke objek. Lalu saya kirim &array jadi saya punya petunjuk ke sana. Katakanlah ukuran_tabel saya adalah 2. Saya mendapatkan kesalahan Segmentasi ketika saya mencoba memasukkan *array[1]=NULL. Apa masalahnya?

Ini kode saya:

    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 sumber
comment
Harap edit pertanyaan Anda dan sesuaikan formatnya.   -  person Aleks G    schedule 23.08.2011
comment
Coba (*array)[i]=NULL;.   -  person Kerrek SB    schedule 23.08.2011


Jawaban (1)


Kode *array[i]=NULL; berfungsi seperti *(array[i])=NULL; dan yang Anda inginkan adalah (*array)[i]=NULL;.

Ketika i=1, *(array[i]) melakukan dereferensi pada struct Object *** yang mengikuti struct Object *** yang Anda masukkan ke dalam mengalokasikanArrayMemory, sementara (*array)[i] melakukan dereferensi pada struct Object ** kedua di area memori yang baru saja dipasangi malloced.

Beberapa catatan:

  1. Perbaiki ejaan 'Segmentasi' pada judul.

  2. Uji hasil malloc sebelum digunakan. Dalam kode Anda, Anda memiliki tes setelah menggunakan *array; pindahkan ke atas.

  3. Saya sarankan menggunakan memset(*array, 0, table_size*sizeof(ObjectP)); daripada loop untuk menginisialisasi *array.

  4. Ini adalah bentuk yang buruk di C untuk memberikan hasil malloc. Sebaliknya, ucapkan saja *array = malloc(table_size*sizeof(ObjectP));.

  5. Dari segi gaya, saya akan menjadikan alokasiArrayMemory sebagai fungsi yang mengembalikan alamat memori yang dialokasikan, bukan melalui parameter. Misalnya:

    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;

dan di penelepon, ObjectP *a; ... a = allocateArrayMemory(6);.

person James Waldby - jwpat7    schedule 23.08.2011