“C Programlama Dili” kitabı neden malloc kullanmam gerektiğini söylüyor?


158

Bugün sayfasına ulaştığı 167 arasında Dili (ikinci baskısı Brian W. Kernighan & Dennis M. Ritchie) Programlama C ve yazar yayınlayabileceğim gerektiğini söylüyor bulundu malloc. İşte kitabın bölümü:

7.8.5 Depolama Yönetimi

Malloc ve calloc işlevleri bellek bloklarını dinamik olarak alır.

void *malloc(size_t n)

başlatılmamış depolama alanının n baytına bir işaretçi veya istek yerine getirilemezse NULL değerini döndürür.

void *calloc(size_t n, size_t size)

belirtilen boyuttaki n nesneden oluşan bir dizi için yeterli boş alana veya istek yerine getirilemiyorsa NULL döndürür. Depolama alanı sıfırlanır. Malloc veya calloc tarafından döndürülen işaretçi, söz konusu nesne için uygun hizalamaya sahiptir, ancak olduğu gibi uygun türe dönüştürülmelidir.

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

Zaten biliyorum ki malloc(ve ailesi) tip void * döndürüyor ve neden dökülmemek için iyi açıklamalar varmalloc .

Ama sorum şu: Kitap neden yayınlamam gerektiğini söylüyor?


125
Çünkü kitap eskidir.
Oliver Charlesworth

12
Çünkü Güneş'in bile karanlık noktaları var, benim cevabım olurdu. Başka bir deyişle, kitap yanlış. Metnin anlambiliminden önce geldiği void *ve güncellenmediği olabilir. Ayrıca bu cevaba bakınız .
açma

8
@Michi Kitabın pek çok olgusal ve tipografik hatası var (google K&R errata), sadece C90 standardıyla biraz uyumludur, 1990'dan beri mevcut C standardına veya dildeki herhangi bir değişikliğe hitap etmemektedir. kötü programlama uygulaması, kötü belirlenmiş davranışa dayanan kötü stil ve kod. Tüm bunlar profesyonel bir C programcısı olmanız durumunda öğrenmeniz gerekir.
Lundin

8
... ve bununla kontrast oluşturmamalıyken derleyici neden şikayet etmiyor? Yani, C için - döküm yapma. C ++ için - cast, ancak kullanmayın mallocçünkü C ++ DEĞİL - yapmanız gerekenler hariç - ama yapmamalısınız - hariç ... AGGGHHHHHH !!!!! :-)
Bob Jarvis - Monica'yı eski

2
@Mandrill Sorumumu okudun mu? Sorumu senin için düzenlemek zorunda kaldım.
Michi

Yanıtlar:


215

Gönderen http://computer-programming-forum.com/47-c-language/a9c4a586c7dcd3fe.htm :

ANSI C öncesi - K & R-1 'de açıklandığı gibi - malloc () a döndürdü char * ve alıcı değişkenin de a olmadığı tüm durumlarda dönüş değerini atmak gerekiyordu char *. void *Standart C'deki yeni tip bu eğilmeleri gereksiz kılar.

Hiç kimseyi K & R-2 savunmasına gereksiz yere sıçramanın utanmasından kurtarmak için, Dennis Ritchie'den yukarıda 142. sayfada verilen cümlenin geçerliliği hakkında teklif verebileceğim konusunda görüş bildirmesini istedim.

Her durumda, şimdi s. 142, bence yanlış; sadece önceki kurallara karşı savunmakla kalmayacak, ANSI kurallarını yanlış tanıtacak şekilde yazılmıştır.


23
Yani malloc'un dönüş türü char ve geçersiz değildi . Teşekkür ederim.
Michi


18
Bu kitap, yanınıza bir kağıt (lar) a basılmadan bu kitabı okumamalısınız.
Lundin

4
@Michi - hayır, dönüş türü char*değildi char. İkisi çok farklı.
Pete Becker

20
@alk: aynen. K&R okuyarak iki gurusu dinliyorsunuz; bu da yeterli ;-)
Steve Jessop
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.