Skal jeg kaste resultatet af malloc?



I [dette spørgsmål](https://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array) var der nogen der i en [kommentar](https://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array#comment388297_571961) foreslog, at jeg ***ikke*** skulle kaste resultatet af `malloc`, dvs.



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

i stedet for:



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

Hvorfor skulle dette være tilfældet?
**Nej**; du *kaster ikke* resultatet, da:


* Det er unødvendigt, da `void *` automatisk og sikkert promoveres til enhver anden pointertype i dette tilfælde.
* Det tilføjer rod i koden, casts er ikke særlig lette at læse (især hvis pointertypen er lang).
* Det får dig til at gentage dig selv, hvilket generelt er dårligt.
* Det kan skjule en fejl, hvis du har glemt at inkludere `<stdlib.h>`. Dette kan forårsage nedbrud (eller, endnu værre, *ikke* forårsage et nedbrud før langt senere i en helt anden del af koden). Tænk på hvad der sker hvis pointere og integers har forskellig størrelse; så skjuler du en advarsel ved at caster og kan miste bits af din returnerede adresse. Bemærk: fra og med C99 er implicitte funktioner forsvundet fra C, og dette punkt er ikke længere relevant, da der ikke længere er nogen automatisk antagelse om, at udeklarerede funktioner returnerer `int`.


Som en præcisering skal du bemærke, at jeg sagde "du skal ikke caste", ikke "du *behøver* ikke at caste". Efter min mening er det en fejl at inkludere cast, selv hvis du har det rigtigt. Der er simpelthen ingen fordele ved at gøre det, men en masse potentielle risici, og at medtage gipsen indikerer, at du ikke kender til risiciene.


Bemærk også, som kommentatorer påpeger, at ovenstående taler om ren C, ikke C++. Jeg tror meget stærkt på C og C++ som separate sprog.


For yderligere at tilføje, at din kode unødigt gentager typeoplysningerne (`int`), hvilket kan forårsage fejl. Det er bedre at de-referere den pointer, der bruges til at gemme returværdien, for at "låse" de to sammen:



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

Dette flytter også `length` til forsiden for at øge synligheden, og dropper de overflødige parenteser med `sizeof`; de *er kun nødvendige* når argumentet er et typenavn. Mange mennesker synes ikke at vide (eller ignorerer) dette, hvilket gør deres kode mere omstændelig. Husk: `sizeof` er ikke en funktion! :)







Selvom det *kan* øge synligheden i nogle sjældne tilfælde at flytte `length` foran, bør man også være opmærksom på, at det i det generelle tilfælde bør være bedre at skrive udtrykket som:



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

Da det at holde `sizeof` først, i dette tilfælde, sikrer, at multiplikationen udføres med mindst `size_t` matematik.


Sammenlign: Sammenlign: `malloc(sizeof *sieve * length * width)` vs. `malloc(length * width * sizeof *sieve)` den anden kan overløbe `length * width` når `width` og `length` er mindre typer end `size_t`.
fedt nok.

da jeg kan se, at dette løste dit problem, kan du så ikke lige 'smutte omkring' og acceptere dette som løst, så andre brugere også kan få glæde af dette 

det kan jo også tænkes, at det ikke er tdc, men ie9, der er skyld i dette - da den jo ikke er så gammel endnu.

mvh

macgyver hej tak for hjælpenprøver dit forslag med tdc butikken. lyder som en god ide´.hvis de ikke vil tage imod dem, tror jeg bare at boksene ryger på genbrugspladsen som elektronikskrot.mvh anders det skulle vel ikke være en netgem.? i så fald er der en fejl som forventes rettet først på eftermiddagen i morgen. det anbefales at den ikke nulstilles. løsning: der er mere end 1.000 mails i min indbakke. derfor skal der slettes mails fra indbakken. jo og der er sikkert nogle, der bruger det. tror dog ikke de tæller med i det samlede billede, men det burde ikke kunne lade sig gøre.for god ordens skyld, har jeg liket dit indlæg. fedt nok.da jeg kan se, at dette løste dit problem, kan du så ikke lige 'smutte omkring' og acceptere dette som løst, så andre brugere også kan få glæde af dette det kan jo også tænkes, at det ikke er tdc, men ie9, der er skyld i dette - da den jo ikke er så gammel endnu.mvhmacgyver hej, var så lidt,hvis det hjælper vil du så ikke markere det som løsning, da det vil hjælpe andre med at finde løsningen, hvis de har samme problem. hej, var så lidt,

hvis det hjælper vil du så ikke markere det som løsning, da det vil hjælpe andre med at finde løsningen, hvis de har samme problem. afsender burde få en tilbagemelding om, at mailboksen er fuld, og mailen ikke kan afleveres.

mvh

kim så må den resettes.