Mengapa buku "Bahasa Pemrograman C" mengatakan saya harus menggunakan malloc?

158

Hari ini saya mencapai halaman 167 dari The C Programming Language (edisi kedua Brian W. Kernighan & Dennis M. Ritchie) dan menemukan bahwa penulis mengatakan saya harus dilemparkan malloc. Inilah bagian dari buku ini:

7.8.5 Manajemen Penyimpanan

Fungsi malloc dan calloc mendapatkan blok memori secara dinamis.

void *malloc(size_t n)

mengembalikan pointer ke n byte penyimpanan yang tidak diinisialisasi, atau NULL jika permintaan tidak dapat dipenuhi.

void *calloc(size_t n, size_t size)

mengembalikan pointer ke ruang kosong yang cukup untuk larik n objek dengan ukuran yang ditentukan, atau NULL jika permintaan tidak dapat dipenuhi. Penyimpanan diinisialisasi ke nol. Pointer yang dikembalikan oleh malloc atau calloc memiliki keselarasan yang tepat untuk objek yang bersangkutan, tetapi harus dilemparkan ke dalam tipe yang sesuai, seperti pada

int *ip;
ip = (int *) calloc(n, sizeof(int));

Saya sudah tahu bahwa malloc(dan keluarganya) mengembalikan tipe void * , dan ada penjelasan bagus mengapa tidak melakukan castmalloc .

Tetapi pertanyaan saya adalah: Mengapa buku itu mengatakan saya harus melemparkannya?

Michi
sumber
125
Karena bukunya sudah tua.
Oliver Charlesworth
12
Karena bahkan Matahari pun memiliki bintik-bintik hitam, akan menjadi jawaban saya. Dengan kata lain, buku itu salah. Bisa jadi teks tersebut sudah ada sebelum semantik void *, dan tidak diperbarui. Lihat juga jawaban ini .
bersantai
8
@Michi Buku ini memiliki banyak kesalahan faktual dan tipografi (google K&R errata), hanya sedikit kompatibel dengan standar C90, tidak membahas standar C saat ini atau perubahan bahasa sejak 1990. Yang terburuk diisi dengan praktik pemrograman yang buruk, gaya dan kode yang buruk yang bergantung pada perilaku yang tidak ditentukan dengan baik. Semua yang Anda harus hapus jika Anda menjadi programmer C profesional.
Lundin
8
... dan kontras dengan Mengapa kompiler mengeluh ketika saya tidak memberikan hasil malloc? Jadi, untuk C - jangan melemparkan. Untuk C ++ - cast, tapi jangan gunakan mallockarena BUKAN C ++ - kecuali saat Anda harus - tetapi Anda tidak boleh - kecuali ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Reinstate Monica
2
@ Mandrill, sudahkah Anda membaca Pertanyaan saya? Saya harus mengedit Pertanyaan saya untuk Anda.
Michi

Jawaban:

215

Dari http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

Dalam pra-ANSI C - seperti yang dijelaskan dalam K & R-1 - malloc () mengembalikan a char * dan perlu untuk memberikan nilai pengembaliannya dalam semua kasus di mana variabel penerima tidak juga a char *. void *Jenis baru dalam Standar C membuat contortions ini tidak perlu.

Untuk menyelamatkan siapa pun dari rasa malu karena melompat sia-sia ke pembelaan K&R-2, saya meminta pendapat Dennis Ritchie bahwa saya dapat mengutip validitas kalimat yang dikutip di atas dari halaman 142. Dia menjawab:

Bagaimanapun, sekarang saya membaca ulang hal-hal di hlm. 142, saya pikir itu salah; itu ditulis sedemikian rupa sehingga tidak hanya defensif terhadap aturan sebelumnya, itu salah mengartikan aturan ANSI.

David Ranieri
sumber
23
Jadi tipe kembali malloc adalah char dan tidak batal . Terima kasih.
Michi
18
Anda tidak boleh membaca buku ini tanpa errata yang dicetak di atas kertas di sebelah Anda.
Lundin
4
@Michi - tidak, tipe pengembaliannya adalah char*tidak char. Keduanya sangat berbeda.
Pete Becker
20
@alk: tepatnya. Dengan membaca K&R, Anda mendengarkan dua guru, yaitu ;-)
Steve Jessop