Table of Contents
In deze handleiding voor rijders beschrijven we enkele van de mogelijke oorzaken die een bepaalde t_check_for_sizeof_st_index_t arraygrootte-fout kunnen veroorzaken, en waarin mogelijke oplossingen worden voorgesteld die u waarschijnlijk zult proberen om het probleem op te lossen.
p>
Goedgekeurd
Kan de lengte van uw huis niet bepalen. Ongeacht hoe gebruikers controleren op arr
, sizeof (arr)
zal altijd de grootte van de retouraanbieding zijn. Daarom verdient het de voorkeur om het aantal chunks van een single als apart argument mee te sturen.
sizeof
werkt beter voor het bepalen van de lengte van een array, voornamelijk als je het toepast, zodat je de originele talloze kunt zien.
geheel getal arr [5]; // echte variëteit. Geen ideemaat (monster); // :)
Wanneer een overvloed echter wordt gedeeld door een aanwijzer, toont sizeof een fractie van de grootte van een aanwijzer en is deze kleiner dan de grootte van de array.
nutteloze getArraySize (int arr [])maat (monster); // indien gewenst, kunt u de grootte van de aanwijzer aangeven
We onderzoeken waarom dit mogelijk kan gebeuren. Hoe kon mijn man bovendien de lengte van mijn C-array weten?
Het zou best een goed idee zijn om arrays niet op te splitsen in pointers als ze normaal gesproken doorgegeven worden aan een functie, maar om de lengte van de array daadwerkelijk op te slaan in de typekit.
Als u uw variabele doorgeeft aan het It-attribuut, zal het uiteenvallen in een pointer. sizeof
geeft resultaten, d.w.z. grootte door het gebruik van int *
. Dit is zonder twijfel een waarschuwing. Een ding waar de compiler van een persoon vaak over klaagt, is
sizeof voor talloze functieparameters arriveert size met verwijzing naar 'int *' als alternatief voor 'int []'
Zoals mijn man en ik suggereerden, als je een array van een persoon aan een functie doorgeeft, moet je bovendien het getal over punten doorgeven –
getArraySize (array, 5); // 5 - het beste aantal elementen in deze array
void getArraySize (int arr [], int element)// jouw spullen
void getArraySize (int arr [], int len) // uw actuele zaken printf ("arraylengte:% n n", len);int hoofd () blend int [] = 1,2,3,4,5; int len is gelijk aan (sizeof (arr) en sizeof (arr [0]); // retourneer het werkelijke bereik van de array getArraySize (matrix, lengte); Herstel 0;
Het element fun () heeft een arrayparameter arr [] nodig of probeert ook de keuze van elementen in arr [] te bepalen, waardoor de operator sizeof wordt verkregen.
In C worden arrayparameters behandeld als advies (zie details hier). Dus de reflectie sizeof (arr) / sizeof (arr [0]) wordt gewoon sizeof (int *) per sizeof (int) wat 1 is voor een IA-bit 32-bit machine (grootte naast int en int * is 4) met als resultaat wordt de for hook in fun () één keer uitgevoerd, ongeacht de grootte die met de array te maken heeft.
Daarom moet je sizeof in dergelijke containers niet gebruiken om een bepaald aantal van alle elementen te krijgen. Een aparte parameter voor een aantal (of lengte) van deze arrays moet worden doorgegeven om u te overtuigen om fun () te gebruiken. Dus het gecorrigeerde programma:
Breid een aantal opmerkingen uit als je iets vindt dat niet klopt in het uitgebreide artikel, of als je dat zou willen om meer informatie te delen over het onderwerp dat hierboven is besproken.
Ascent komt oorspronkelijk uit Hello Worlds-programma’s. Leer hoe u structuren zoals heaps, heaps, gelinkte lijsten en meer implementeert! Check bood onze C Data Structures-cursus aan om vandaag aan de slag te gaan.
De sizeof
driver geeft het type (in bytes) van zijn operand, die waarschijnlijk een expressie of een enkel type specificatie tussen haakjes zal zijn. Het gebruik van de basis sizeof
provider om de lichaamsvorm in arrays te bepalen is echter kwetsbaar.
De grootte van het netwerk
heeft vaak de voorkeur om te bepalen hoe geheugen moet worden toegewezen met behulp van malloc ()
. Het gebruik van de verkeerde maat kan echter mogelijk de MEM35-C in gevaar brengen. + Wijs + + net genoeg geheugen + toe voor een onderwerp “> MEM35-C. Wijs + + genoeg harde schijf toe voor een object .
Voorbeeld van incompatibele procedure
In dit voorbeeld met betrekking tot ongeldige code, zet de lay-out free ()
de in-oorzaken op nul, een nieuwe array. De functieparameter van de eerste operatie wordt gedeclareerd als int collection []
en geeft feitelijk elke statische array van 12 int
door als argument. De functie clear ()
gebruikt het idioom sizeof (array) voor elke waarde van sizeof (array [0])
die het aantal elementen in de array bepaalt. De selectie
is echter van het type pointer omdat het dan een parameter is. Als een gedetailleerd resultaat is sizeof (array)
letterlijk gelijk aan elke *) sizeof (int. Bijvoorbeeld een grote architectuur (zoals IA-32) waar de sleutel
sizeof (int ) ==
en enkele van sizeof (int *) == 4
, het woord sizeof (array) voor elke sizeof (array [0])
evalueert tot 1 bijzonder , wat de lengte is met betrekking tot het doorgegeven type, waarbij het slapen van de array meestal onaangeroerd blijft.
Voetnoot 103 helemaal Paragraaf 6.5.3. Sommige C-normen [