SORU
3 Mart 2009, Salı


Malloc sonucu dökme muyum?

this question, biri ben bir yorum ileri sürdüdeğilmalloc, sonuçlarını attıben.e:

int *sieve = malloc(sizeof(int)*length);

yerine:

int *sieve = (int *)malloc(sizeof(int)*length);

Neden bu durumda olurdu?

CEVAP
3 Mart 2009, Salı


Hayır;yoksonuç dökme, itibaren:

  • void * otomatik olarak ve güvenli bir şekilde bu durumda başka bir işaretçi türü terfi gibi gereksiz.
  • Eğer <stdlib.h> eklemeyi unuttum Eğer bir hata gizlemek olabilir. Bu çöker (ya da daha kötüsü . neden olabilir ^em>değildaha sonra kodu tamamen farklı bir bölümünde de yol kadar bir kilitlenme) neden olur. Eğer işaretçiler ve tamsayılar farklı boyutta olursa ne olur; o zaman döküm tarafından bir uyarı sakladığını ve iade adresinizi parçaları kaybedebilir.
  • Kod karmaşası ekler atmalarını çok kolay okunur özellikle eğer işaretçi türü uzun ise).
  • Genellikle kötü olan kendini tekrar ediyor.

Bir açıklama olarak, dedim unutmayın "büyü yapmıyorsun", "yok değilgerekdöküm". Benim görüşüme göre, eğer doğru varsa bile oyuncular vardır, bir başarısızlık. Sadece bunu yapmak için faydaları vardır hayır, ancak potansiyel riskleri ve döküm de dahil olmak üzere bir sürü riskleri hakkında bilmediğini gösterir.

Ayrıca düz C, C için yukarıdaki değiştiren yorumcuların işaret ettiği gibi, unutmayın . Ben çok kesin bir biçimde ayrı dil olarak C ve C inanıyor.

Daha fazla eklemek için, kodunuzu gereksiz hatalara neden olabilir hangi tür bilgileri (int) tekrarlar. Bu işaretçi çözümlemesi için daha iyi bir dönüş değeri saklamak için kullanılan "kilit" ikisi bir arada:

int *sieve = malloc(length * sizeof *sieve);

Bu da artan görünürlük için ön length hareket ve sizeof; onlar ile gereksiz parantez içinde bırakırsadece gereklibağımsız bir tür adıdır. Birçok kişi onların kodunu daha ayrıntılı yapar (veya görmezden) bu değil biliyorum, görünüyor. Unutmayın: sizeof bir fonksiyon değil! :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kev5124

    kev5124

    9 Kasım 2008
  • kylelandry

    kylelandry

    9 AĞUSTOS 2007
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012