Soru Malloc'un sonucunu ben mi atıyorum?


İçinde bu sorubiri önerdi yorum Yap yapmalıyım değil sonuca dökmek mallocyani

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

ziyade:

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

Neden böyle olsun?


2043
2018-03-03 10:13


Menşei


Ayrıca, elek = malloc (sizeof * elek * uzunluğu) yazmak daha sürdürülebilirdir; - William Pursell
stackoverflow.com/q/7545365/168175 - Flexo♦
@KarolyHorvath bu tek sebep değil. Diğer (ve en önemlisi, IMHO), kodu daha esnek (henüz daha az güvenli veya sağlam değil) yapmaktır. sieve int değişiyor, diyelim. malloc( sizeof *sieve * length ); Bir türün bakım gerektirmesi, hiçbir şey eklememesi ve hataların izini sürdürebilmesi için, türden bağımsız olarak çalışır. - MestreLion
@MestreLion: "ve hataları izlemek için zor oluşturabilirsiniz" - tek yapmanız gereken derleme uyarılarını etkinleştirmektir ve asla olacak. OTOH yoksa, gerçekten hak ediyorsun. ve yine, onu kullanmanın bir savunucusu değilim .. hepsi söylüyorum ki bu gerçekten önemli değil ... genelde zararsız :) - Karoly Horvath
Ayrıca bakınız Özellikle, sonuçların dökümünü yapmak için tehlikeli olan şey malloc()? - Jonathan Leffler


Cevaplar:


Yok hayır; sen yapamaz Sonucu, çünkü

  • Gereksizdir void * bu durumda otomatik olarak ve güvenli bir şekilde diğer herhangi bir işaretçi türüne yükseltilir.
  • Kodlara dağınıklığı ekler, yayınların okunması çok kolay değildir (özellikle işaretçi tipi uzunsa).
  • Kendinizi tekrar etmenizi sağlar, ki bu genellikle kötüdür.
  • Eklemeyi unuttuysanız bir hatayı gizleyebilir <stdlib.h>. Bu çökmelere sebep olabilir (veya daha kötüsü, değil kodun tamamen farklı bir bölümünde daha sonra bir kaza neden olur). İşaretçiler ve tam sayıların farklı boyutlarda olması durumunda ne olacağını düşünün; daha sonra, bir uyarıyla gizleme yapıyorsunuz ve döndüğünüz adresin bitlerini kaybedebilirsiniz. Not: C11'den itibaren örtük işlevler C'den silinir ve bildirilmemiş işlevlerin geri döndüğüne dair otomatik bir varsayım olmadığından bu nokta artık geçerli değildir. int.

Bir açıklama olarak, "sen almazsın" dediğimi not et, gerek "Benim düşünceme göre, haklı olsanız bile oyuncu kadrosuna yer verilmemesi bir başarısızlıktır. Bunu yapmanın hiçbir yararı yoktur, ancak bir takım potansiyel riskler ve döküm de dahil olmak üzere bilmediğinizi gösterir. riskler hakkında.

Ayrıca, yorumcuların işaret ettiği gibi, yukarıdaki C ++ değil düz C ile ilgili görüşmelerin de dikkat çektiğini unutmayın. C ve C ++ 'ya ayrı diller olarak çok inanıyorum.

Daha fazla eklemek için kodunuz tür bilgisini gereksiz yere tekrarlar.int) hatalara neden olabilir. Dönüş değerini saklamak için kullanılan işaretçiyi ayırmak, ikisini birlikte "kilitlemek" daha iyidir:

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

Bu aynı zamanda length daha fazla görünürlük sağlamak için ön tarafa ve gereksiz parantezleri sizeof; onlar sadece ihtiyaç var argüman tip adı olduğunda. Pek çok insan bunu bilmez (ya da görmezden gelir), bu da kodlarını daha ayrıntılı hale getirir. Hatırlamak: sizeof bir işlev değil! :)


Hareket ederken length öne Mayıs ayı Bazı ender durumlarda görünürlüğü arttırmak, aynı zamanda genel durumda, ifadeyi aşağıdaki gibi yazmak daha iyi olmalıdır:

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

Tutmak yana sizeof İlk olarak, bu durumda, çoğaltma en az ile yapılmasını sağlar size_t matematik.

Karşılaştırmak: malloc(sizeof *sieve * length * width) vs. malloc(length * width * sizeof *sieve) ikincisi taşabilir length * width ne zaman width ve length daha küçüktür size_t.


1917
2018-03-03 10:17



@unwind Hayır, sıkı C kodunda bile, portatif kullanım için dökümünü kullanıyorum. Taşınabilirlikle kastettiğim, void * 'nin terfi edilmediği c standardının eski sürümleri için taşınabilir. K & R'ın "C Programlama Dili" nden alıntı yapıyorum: "C" de uygun yöntem, malloc 'un bir işaretçiyi geçersiz kıldığını, sonra işaretçiyi bir cast ile istenen tür içine açıkça zorladığını bildirmektir. " Böyle bir şartı dayatmamın nedeni, her zaman hangi derleyicinin kullanabileceğini seçme seçeneğiniz olmamasıdır. - chacham15
@ chacham15 C'nin önceki versiyonları varken dil Oyuncunun gerekli olduğu yerlerde (K & R C void* yazın!), bu sürümler asla standart. C89 (ilk standart versiyon) gerekli malloc dönüş void* ve şu void* dolaylı olarak dönüştürülebilir ol. - jamesdlin
@Soumen Belki de çok karanlık; içermeyen bir dönüş türü int Daha küçük olabilir, kabul edilecektir void *öyleyse, ödev, yayın tarafından bastırılacak bir uyarı oluşturabilir. Görmek bu soruÖrneğin. - unwind
@unwind Çoğu derleyici, gizli olarak tanımlanmış bir işlev hakkında sizi uyarır ... (bu yüzden oyuncuların tehlikesini göremiyorum) - DarthRubik
@ LOuM. Tamam. Burada okuyan birinin belirli bir derleyiciye sahip olduğunu varsaymak kötü. Ayrıca, C11'den beri “örtük işlev” kavramı gitmişti, bunu bilmiyordum. Yine de, anlamsız bir döküm ekleme noktasını göremiyorum. Sende yapar mısın int x = (int) 12; sadece işleri netleştirmek için mi? - unwind


C’de, dönüş değerini malloc. Void tarafından döndürülen işaretçi malloc otomatik olarak doğru türüne dönüştürülür. Ancak, kodunuzun bir C ++ derleyicisiyle derlenmesini isterseniz, bir döküm gerekir. Topluluk arasında tercih edilen bir alternatif, aşağıdakileri kullanmaktır:

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

Bu, eğer türünü değiştirirseniz, ifadenin sağ tarafını değiştirme konusunda endişelenmenize de gerek bırakmaz. sieve.

İnsanların işaret ettiği gibi oyuncular kötüdür. Özel işaretçiler dökümler.


327
2018-03-03 10:17



@MAKZ Bunu tartışırım malloc(length * sizeof *sieve) onu benziyor sizeof bir değişken - bu yüzden düşünüyorum malloc(length * sizeof(*sieve)) daha okunabilir. - Michael Anderson
Ve malloc(length * (sizeof *sieve)) hala daha okunabilir. BENİM NACİZANE FİKRİME GÖRE. - Toby Speight
@Michael Anderson () bir kenara, önerilen stilin siparişi değiştirdiğine dikkat edin., öğe sayısının length*widthtutmak sizeof İlk olarak bu durumda sigorta çoğaltma en az ile yapılır size_t matematik. Karşılaştırmak malloc(sizeof( *ptr) * length * width) vs. malloc(length * width * sizeof (*ptr)) - 2. aşan taşabilir length*width ne zaman width,length daha küçük tipler size_t. - chux
@chux açık değil, ama cevabım düzeltildi, böylece yorumum daha az alakalıydı - orijinal öneri malloc(sizeof *sieve * length) - Michael Anderson
C, C ++ değildir. Sonunda olduklarını iddia ederek kafa karışıklığına ve üzüntüye yol açacaktır. C ++ kullanıyorsanız, C stili bir döküm de bozuk (çok eski bir C ++ derleyici kullanmıyorsanız). Ve static_cast>() (veya reinterpret_cast<>() ) C.'nin herhangi bir lehçesi ile uyumlu değildir. - David C.


Sen yap döküm, çünkü:

  • Kodunuzu yapar daha taşınabilir C ve C ++ arasında ve SO deneyimi gibi, birçok programcı C ++ (veya C + yerel derleyici uzantıları) yazarken C dilinde yazdıklarını iddia ediyor.
  • Bunu yapmamak bir hatayı gizleyebilir: ne zaman yazacağınız kafa karıştırıcı tüm SO örneklerini not edin type * e karşı type **.
  • Sizi fark etmenizi engelleyen fikir başarısız oldu #include uygun bir başlık dosyası özlüyor ağaçlar için orman. “Derleyiciden prototipleri görmemekten şikâyet etmesini istemediğin gerçeğini dert etme” demekle aynı şeydir - bu sinir bozucu stdlib.h hatırlamak için GERÇEK önemli bir şeydir! ”
  • Bir zorlar ekstra bilişsel çapraz kontrol. Bu değişkenin ham boyutu için yaptığınız aritmetiğin hemen yanında (iddia edilen) istenen türü koyar. Bahse girerim ki bunu gösteren bir SO çalışması yapabilirsin. malloc() Bir oyuncu olduğunda hatalar çok daha hızlı yakalanır. İddialarda olduğu gibi, niyetin ortaya çıkardığı ek açıklamaları da hataları azaltır.
  • Makinenin kontrol edebileceği şekilde kendinizi tekrar etmek genellikle bir harika fikir. Aslında, bir iddia budur ve bu cast kullanımı bir iddiadır. Turing, kodlamayı doğru yapmak için sahip olduğumuz en genel tekniktir. Çünkü Turing, yıllar önce fikriyle ortaya çıktı.

292
2018-02-14 16:15



@ulidtko Bilmediğiniz durumda, hem C hem de C ++ olarak derleyen kod yazılabilir. Aslında çoğu başlık dosyaları bu gibi ve genellikle kod (makrolar ve satır içi işlevleri) içerir. Sahip olmak .c/.cpp her ikisi de derlemek için dosya çok sık yararlı değil, ama bir durumda C ++ ekliyor throw C ++ derleyicisi ile derlendiğinde destek return -1; C derleyici ile derlendiğinde veya herhangi bir şekilde). - hyde
Birisi bir satır içi satır içi çağrıları yapsaydı, etkilenmezdim, #fdef __cplusplus ve extern "C" {} bu iş içindir, ekstra atmalara eklenmez. - paulm
Peki, nokta 1, ilgisizdir, çünkü C! = C ++, kullandığınız diğer noktalar da önemsizdir. değişken senin içinde malloc aramak: char **foo = malloc(3*sizeof(*foo)); tam olarak ispat ise: char işaretçilerine 3 işaretçi. sonra döngü ve yap foo[i] = calloc(101, sizeof(*(foo[i])));. Sıfırlar için düzgünce başlatılan 101 karakter dizisini ayırın. Cast gerekmiyor. bildirimi değiştir unsigned char ya da başka bir tür, bu konuda, ve hala iyisin - Elias Van Ootegem
Anladığımda anladım, işte geliyor! Fantastik cevap. StackOverflow'da ilk kez bu kez iki ters cevap + 1'ledim! +1 Hayır, atmayın ve +1 Evet, sen yaparsın! LOL. Siz müthişsiniz. Ve benim ve öğrencilerim için, aklımdan geldim: Ben döküm yapıyorum. Öğrencilerin yaptığı hataların türü, döküm yaparken daha kolay tespit edilir. - Dr Beco
@Leushenko: Makineyle veya yerel denetim tarafından doğrulanamayacak şekilde kendinizi tekrar etmek kötüdür. Bu yollarla doğrulanabilecek yollarla kendinizi tekrarlamak daha az kötüdür. verilmiş struct Zebra *p; ... p=malloc(sizeof struct Zebra);malloc, p tipi ile ilgili bilgileri duplize etmekten kaçınılamaz, fakat ne tür bir değiştirilirse diğeri de değişmezse ne derleyici ne de yerel kod denetimi herhangi bir sorunu algılayamaz. Kodu değiştir p=(struct Zebra*)malloc(sizeof struct Zebra);ve döküm tipi eşleşmezse derleyici squawk olacaktır p, ve yerel muayene ortaya çıkaracak ... - supercat


Diğer belirtildiği gibi, C için gerekli değil, C ++ için. C kodunuzu bir C ++ derleyicisi ile derleyeceğinizi düşünüyorsanız, hangi sebeplerle olursa olsun, aşağıdaki gibi bir makro kullanabilirsiniz:

#ifdef __cplusplus
# define NEW(type, count) ((type *)calloc(count, sizeof(type)))
#else
# define NEW(type, count) (calloc(count, sizeof(type)))
#endif

Bu şekilde hala çok kompakt bir şekilde yazabilirsiniz:

int *sieve = NEW(int, 1);

ve C ve C ++ için derler.


148
2018-03-03 11:17



Zaten bir makro kullandığınız için neden kullanmıyorsunuz? new C ++ tanımında? - Hosam Aly
Çünkü bunu yapmak için bir sebep yok. Temel olarak bir C ++ derleyicisi ile derlenen C programları içindir. Eğer 'yeni' kullanacaksan, aldığın tek şey problemler. Daha sonra ücretsiz bir makroya ihtiyacınız var. Ve bir diziyi serbest bırakmak için bir makroya, C'de bulunmayan bir farklılığa ihtiyacınız var. - quinmars
Hafızayı serbest bırakan kişi değil, belki de kullandığınız bir C kütüphanesi mi olduğu söylenmez. Herhangi bir kazanç olmadan birçok olası problem. - quinmars
@Hosam: Evet, kesinlikle öyle. Eğer kullanırsan new kullanmalısın delete ve eğer kullanırsan malloc() sen olmalısın free(). Asla onları karıştırmayın. - Graeme Perrow
Birisi bu yaklaşımı alacaksa, makronun çağrılması NEW kaynak asla kullanılmadığı için muhtemelen kötü bir fikirdir delete (veya DELETE) böylece kelime bilginizi karıştırıyorsunuz. Bunun yerine, adlandırma MALLOCya da daha doğrusu CALLOC Bu durumda, daha anlamlı olur. - mah


İtibaren Vikipedi

Döküm için avantajlar

  • Döküm dahil, bir C programının veya fonksiyonunun C ++ olarak derlenmesine izin verebilir.

  • Oyuncular, başlangıçta bir char * döndüren malloc'un 1989 öncesi versiyonlarına izin verir.

  • Döküm, özellikle işaretçinin malloc () çağrısından çok uzak olduğu bildirilmişse (özellikle derleyicileri ve statik çözümleyicileri bu tür davranışlarda kalıba gerek kalmadan uyarı verebilirse bile), hedef işaretçi türünün değişmesi durumunda, yazım tipindeki tutarsızlıkları saptamaya yardımcı olabilir.

Döküm için dezavantajlar

  • ANSI C standardı altında, döküm gereksizdir.

  • Dökümün eklenmesi, başlığın dahil edilmemesini maskeleyebilir stdlib.h, içinde   malloc için prototip bulunur. Yokluğunda   malloc için prototip, standart C derleyicisini gerektirir   malloc bir int döndürür varsayalım. Oyuncu yoksa, uyarı   Bu tam sayı işaretçiye atandığında verilir; ancak   döküm, bu uyarı üretilmiyor, bir hata gizleniyor. Belli   mimariler ve veri modelleri (örneğin 64 bit sistemlerde LP64 gibi)   uzun ve işaretçiler 64 bit ve int 32 bittir), bu hata   örtük olarak bildirildiği gibi, aslında tanımlanmamış davranışlarla sonuçlanır.   malloc gerçek tanımlanmış fonksiyona karşılık 32 bitlik bir değer döndürür   64 bitlik bir değer döndürür. Çağrı kurallarına ve belleğe bağlı olarak   düzen, bu yığın parçalanmasıyla sonuçlanabilir. Bu sorun daha az olası   modern derleyicilerde fark edilmeden, tekdüze ürettikleri gibi   bildirilmemiş bir fonksiyonun kullanıldığına dair uyarılar, dolayısıyla bir uyarı   hala görünüyor. Örneğin, GCC'nin varsayılan davranışı   "yerleşik" in uyumsuz örtük beyanını okuyan uyarı   "dökümün mevcut olup olmadığına bakılmaksızın" işlevi.

  • İmlecin tipi beyanında değiştirilirse,   ayrıca, malloc'un çağrıldığı ve yayınlandığı tüm satırları değiştirmeniz gerekir.

olmasına rağmen döküm olmadan malloc tercih edilen bir yöntemdir ve en deneyimli programcılar bunu seçerSorunlardan haberdar olmak istediğinizi kullanmalısınız.

i.e: C programını C ++ olarak derlemeniz gerekiyorsa (bunlar ayrı bir dil olmasına rağmen) malloc döküm ile.


96
2017-10-09 21:23



Nedir "Döküm, özellikle işaretçi uzaktaysa bildirilirse, geliştiricinin hedef işaretçi türünün değişmesi durumunda tip boyutlandırmasındaki tutarsızlıkları tespit etmesine yardımcı olabilir. malloc() aramak"Bir örnek verebilir misiniz? - Cool Guy
@CoolGuy: Başka bir cevaba ilişkin önceki bir yoruma bakın. Ama unutmayın ki p = malloc(sizeof(*p) * count) deyim otomatik olarak türdeki değişiklikleri alır, böylece uyarı almak ve herhangi bir şeyi değiştirmek zorunda kalmazsınız. Yani bu, döküm için en iyi alternatifi olmayan gerçek bir avantaj değildir. - Peter Cordes
Doğru cevap budur: Artıları ve eksileri vardır ve tadı bir tadı olana kadar kaynar (eğer kod C ++ olarak derlenmezse - o zaman döküm zorunludur). - Peter A. Schneider
Nokta 3, çünkü işaretçinin türünün bildirimde değiştirilmiş olması durumunda, bir tür malloc, realloc ve bu tür yerleşik olmayan her örneği kontrol etmelisiniz. Döküm sizi sadece bunu yapmaya zorlar. - Michaël Roy


C'de bir boşluk işaretçisini herhangi bir tür işaretçiye dolaylı olarak dönüştürebilirsiniz, böylece bir döküm gerekli değildir. Birinin kullanılması, sıradan gözlemciye, neden gerektiğine dair bir sebep olduğunu ve yanıltıcı olabileceğini düşündürebilir.


94
2018-03-03 10:18





Malloc'un sonucunu almazsınız, çünkü bu işlem kodunuza anlamsız bir karmaşa ekler.

İnsanların malloc sonucunu almasının en yaygın nedeni, C dilinin nasıl çalıştığından emin olmadıklarıdır. Bu bir uyarı işaretidir: eğer belirli bir dil mekanizmasının nasıl çalıştığını bilmiyorsanız yapamaz tahminde bulun. Bakın ya da Yığın Taşması'nı sorun.

Bazı yorumlar:

  • Bir boşluk işaretçisi, açık bir döküm olmadan başka herhangi bir işaretçi türüne dönüştürülebilir (C11 6.3.2.3 ve 6.5.16.1).

  • Ancak C ++, arasında gizli bir yayınlamaya izin vermez void* ve başka bir işaretçi türü. Yani C ++, oyuncu doğru olurdu. Ama eğer C ++ programında ders alırsanız new ve değil malloc (). Ve bir C ++ derleyici kullanarak asla C kodu derlememelisiniz.

    Hem C hem de C ++ 'yı aynı kaynak koduyla desteklemeniz gerekiyorsa, farklılıkları işaretlemek için derleyici anahtarlarını kullanın. Her iki dil standardını da aynı kodla sıralamaya çalışmayın, çünkü uyumlu değillerdir.

  • Bir C derleyicisi bir üstbilgiyi eklemeyi unuttuğunuz için bir işlev bulamazsa, bu konuda bir derleyici / linker hatası alırsınız. Yani dahil etmeyi unuttuysanız <stdlib.h> Bu biggie değil, programınızı oluşturamayacaksınız.

  • 25 yaşın üstündeki standardın bir versiyonunu takip eden eski derleyicilerde, dahil etmeyi unutmak <stdlib.h> tehlikeli davranışlarla sonuçlanır. Çünkü bu eski standartta, görünür bir prototip içermeyen işlevler, dolaylı olarak dönüş türünü int. Sonuç, malloc'dan açıkça alıntı yapmak, bu hatayı gizler.

    Ama bu gerçekten bir sorun değil. 25 yaşında bir bilgisayar kullanmıyorsunuz, o zaman neden 25 yaşında bir derleyiciyi kullanıyorsunuz?


83
2018-03-20 15:53



"anlamsız dağınıklık", zaten size katılmayan kimseyi ikna etme olasılığını ortadan kaldıran göz ardı edilemez bir hiperboldur. Bir oyuncu kesinlikle anlamsız değil; Ron Burk ve Kaz'ın cevapları, tartışmaya katıldığım lehine argümanlar üretiyor. Bu endişelerin, bahsettiğiniz endişelerden daha ağır olup olmadığı sorulması makul bir sorudur. Benim için endişeleriniz onlarınkine kıyasla nispeten küçük görünüyor. - Don Hatch
"Bir boşluk işaretçisi, herhangi bir işaretçi türünü, herhangi bir açık işaret olmadan dönüştürülebilir", 6.3.2.3 tarafından desteklenmemektedir. Belki de "herhangi bir nesne tipine işaretçi" mi düşünüyorsunuz? "void pointer" ve "bir işleve işaretçi", kolayca dönüştürülebilir değildir. - chux
Gerçekten de referans eksikti. “Örtüklük” için ilgili kısım, basit atamanın kuralıdır. 6.5.16.1. "bir işlenen, bir nesne türünün işaretçisidir ve diğeri, kalifiye veya nitelendirilmemiş bir geçersiz sürümün bir işaretçisidir". Bu referansı tamamlanma yanıtına ekledim. - Lundin


C'de, örtülü bir dönüşüm elde edersiniz void* herhangi bir başka (veri) işaretçisine.


82
2018-03-03 10:16



@Jens: Tamam, belki de daha doğru ifadeler "örtük dönüştürme" dir. Kayan nokta ifadesinde integral değişken kullanımı gibi. - EFraim
@EFraim Bu aslında bir oyuncuyla sonuçlanacak ve bunun da üstü kapalı bir sonuç olacaktır. - Mad Physicist


Tarafından döndürülen değer malloc() şimdi gerekli değil, ama kimse işaret etti görünüyor bir nokta eklemek istiyorum:

Eski günlerde, daha önce ANSI C sağlar void * genel işaretçi türü olarak, char * bu tür kullanım için bir türüdür. Bu durumda, döküm derleyici uyarılarını kapatabilir.

Referans: C SSS


62
2018-06-09 17:31



Derleyici uyarılarını kapatmak kötü bir fikirdir. - Albert van der Horst
@AlbertvanderHorst Eğer tam sorunu çözerek yapıyorsanız, uyarı sizi uyarmak için var. - Dan Bechard
@ Dan. Eğer kesin problemi çözerek, bir modemin char * yerine modern ANSI C türlerini döndürmek için yeniden yazılması gerekiyorsa, katılıyorum. Bunu derleyiciyi kapatması demezdim. Olası problemleri bulmak için her derleme ile kullanmak yerine derleyici uyarılarının bulunmadığı konusunda ısrar eden yöneticilere vermeyin. Groetjes Albert - Albert van der Horst


Sonuçlarının dökümü zorunlu değildir mallocdöndüğünden void* ve bir void*herhangi bir veri türüne işaret edilebilir.


48
2018-02-07 22:22





Sadece benim deneyimimi ekleyerek, bilgisayar mühendisliği okuyorum C yazarken gördüğüm iki ya da üç profesörün her zaman malloc attığını görüyorum, ancak sorduğum kişi (büyük bir özgeçmiş ve C anlayışıyla) kesinlikle gereksiz olduğunu söyledi ama sadece kesin olarak özeldi ve öğrencileri kesinlikle özgül olma zihniyetine sokardı. Aslında döküm, nasıl çalıştığıyla ilgili hiçbir şeyi değiştirmeyecek, tam olarak söylediği şeyi yapıyor, bellek ayırıyor ve döküm onu ​​etkilemiyor, aynı belleği alıyorsunuz ve hatta yanlışlıkla başka bir şeye atıyor olsanız bile (ve bir şekilde derleyiciden kaçınıyorsanız) Hatalar) C aynı şekilde erişir.

Düzenle: Dökümün belli bir noktası var. Dizi gösterimi kullandığınızda, üretilen kod, bir sonraki öğenin başına ulaşmak için kaç bellek yeri gerektiğini bilmek zorundadır; bu, döküm yoluyla gerçekleştirilir. Bu şekilde, bir çift için 8 byte ilerlediğini biliyorsunuz, bir int için ise 4'e gidiyorsunuz. Böylece, işaret gösterimini kullanırsanız, notasyonda gerekli olursa, hiçbir etkisi yoktur.


44
2018-03-28 18:21



Daha önce bahsedildiği gibi, dökümler hataları gizleyebilir ve kodu derleyici veya statik analizör için analiz etmek zorlaştırabilir. - Lundin
"Aslında döküm, nasıl çalıştığını değiştirmeyecek". Eşleşen türe dökülecek bir şey değiştirilmemeli, ancak türün değişmesi ve dökümün artık eşleşmemesi sorunu olabilir mi? IWO'lar, döküm ve varyantlar bakım işlerinin iki katı - senkronizasyonda tutulmalıdır. - chux
Profilerin neden döküm yapmayı tercih ettiğini anlayabiliyorum. Döküm, eğitmen bilgisine iletildiği eğitimsel bir noktadan yararlı olabilir ve öğrenci kodunun muhafaza edilmesi gerekmez - atma kodu. Yine de bir kodlama, hakem değerlendirmesinden ve bakım perspektif, p = malloc(sizeof *p * n); çok basit ve daha iyi. - chux