Inisialisasi dan penanganan alokasi memori C

Mengalami masalah dengan tugas saya di sini. Saya perlu membuat blok global memori bebas dan malloc itu. Mengalami masalah saat menginisialisasinya karena kesalahan ketik dan penanganan.

Seperti array di C di mana array pertama sebenarnya adalah penunjuk ke elemen pertama, blok memori saya harus serupa di mana saya dapat menggunakan aritmatika penunjuk untuk menemukan blok memori.

//global variable
static byte *memory = NULL;

void allocator_init(u_int32_t size){

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

Alamat/pointer ke alamat memori ini akan disimpan melalui struct/link sebagai header blok memori.

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

person ryantata    schedule 17.08.2012    source sumber
comment
Jika Anda telah menyertakan header <stdlib.h>, pemerannya berlebihan; jika Anda belum memiliki pemeran, sembunyikan bug jahat ... atau Anda lebih baik tanpa pemeran apakah Anda menyertakan header yang tepat :)   -  person pmg    schedule 17.08.2012
comment
Ya, itu termasuk di atas   -  person ryantata    schedule 17.08.2012


Jawaban (4)


Jatuhkan *:

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

Anda mungkin juga ingin melepaskan pemerannya, tetapi itu keputusan Anda.

person cnicutar    schedule 17.08.2012
comment
Anda mungkin juga ingin melepaskan pemerannya, tetapi itu keputusan Anda. - jika itu C++, maka tidak. Kalau C, maka juga bukan: stackoverflow.com/questions/605845/ - person ; 17.08.2012
comment
@ H2CO3 Saya pernah membaca postingan dari pengguna SO ternama yang mengatakan ada pro dan kontra dalam memasukkan hasil malloc di C. - person cnicutar; 17.08.2012
comment
@H2CO3 Jelas tidak. Saya tidak ingat siapa orang itu atau saya akan menyebutkan namanya. - person cnicutar; 17.08.2012
comment
maka saya tidak membantah :) (Serius, itu hanya membuat kode tidak dapat dibaca dan rawan kesalahan jika Anda lupa memasukkan stdlib.h...) - person ; 17.08.2012
comment
@H2CO3 Saya juga tidak melakukan cast tetapi saya juga tidak secara langsung menyarankan orang lain untuk melakukan hal yang sama. - person cnicutar; 17.08.2012
comment
Jika Anda memerlukan casting pointer, mungkin Anda tidak mengkompilasi C (tetapi C++) - person pmg; 17.08.2012

Anda perlu menetapkan nilai kembalian malloc ke penunjuk itu sendiri, bukan ke byte yang ditunjuk oleh penunjuk. (Lagi pula, jika Anda melakukan dereferensi penunjuk NULL awalnya, program Anda akan melakukan segfault.)

memory = malloc(size);

Selain itu, jangan perhatikan nilai kembalian malloc.

person Community    schedule 17.08.2012

*memory = (byte*) malloc(size); - Pernyataan ini berarti Anda mencoba menetapkan alamat blok memori heap sebagai nilai ke *memory. Di sini memory memiliki NULL, sehingga akan crash.

Anda harus menetapkan alamat ke variabel seperti, memory = (byte*) malloc(size);

person rashok    schedule 17.08.2012
comment
jadi apakah statis global akan mengatur penetapan memori variabel untuk digunakan sebagai penunjuk?? - person ryantata; 17.08.2012
comment
Tidak, Anda harus menetapkan pengembalian alamat sebesar malloc hanya ke variabel memory meskipun itu juga variabel lokal. - person rashok; 17.08.2012

Di struct header Anda, karena struct mereferensikan dirinya sendiri, nyatakan pointer header internal sebagai "struct _header * name;". Saya pikir orang lain telah mencapai semua poin lainnya :)

person Neil    schedule 17.08.2012