Allokér et array
Reservér heap-hukommelse.
Allokér et array er en gratis C Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C Academy-kurset indeholder 4 lektioner i alt.
Hvorfor dynamiske arrays?
Et normalt array har en fast størrelse, der fastlægges under kompilering. Men ofte ved du først, hvor mange elementer du har brug for, når programmet kører.
Dynamiske arrays løser dette: Du beder operativsystemet om en blok hukommelse under kørsel med malloc, og du bestemmer størrelsen med en variabel.
Mød malloc
malloc (memory allocate) findes i <stdlib.h>. Du giver den et antal bytes, og den returnerer en pointer til blokken eller NULL, hvis det mislykkes.
Hukommelsen kommer fra heapen og forbliver allokeret, indtil du frigiver den.
int *p = malloc(10 * sizeof(int));Størrelsesberegning med sizeof
Hardkod aldrig antal bytes. Brug sizeof, så koden forbliver korrekt på tværs af platforme.
Hvis du vil allokere plads til n heltal, skal du gange n med sizeof(int). Et almindeligt idiom er n * sizeof(*p), som bruger pointerens egen type.
int *p = malloc(n * sizeof(*p));Kontrollér altid for NULL
Hvis systemet løber tør for hukommelse, returnerer malloc NULL. Dereferering af en NULL-pointer får programmet til at gå ned.
Kontrollér resultatet, før du bruger det. Denne ene vane forhindrer mange fejl, der ellers er svære at fejlfinde.
int *p = malloc(n * sizeof(*p));
if (p == NULL) {
fprintf(stderr, "out of memory\n");
return 1;
}En komplet allokering
Her er et komplet program, der allokerer plads til 5 heltal, udfylder dem og udskriver dem.
Bemærk symmetrien: malloc i begyndelsen og free til sidst.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 5;
int *a = malloc(n * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) a[i] = i * i;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}malloc nulstiller ikke
Hukommelse fra malloc er uinitialiseret: Den indeholder det, der tilfældigvis lå der før.
Hvis du læser den, før du skriver til den, får du uforudsigelige værdier. Tildel altid en værdi til hvert element, før du læser det.
int *a = malloc(3 * sizeof(*a));
/* a[0], a[1], a[2] hold garbage here */
a[0] = 10;calloc nulstiller for dig
calloc(count, size) allokerer plads til count elementer på hver size bytes og sætter hver byte til nul.
Brug den, når du ønsker et rent, nuludfyldt array. Den beskytter også mod overflow i multiplikationen.
int *a = calloc(5, sizeof(*a));
/* every element is now 0 */calloc i praksis
Dette program bruger calloc og bekræfter, at arrayet starter med nulværdier, før vi ændrer det.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 4;
int *a = calloc(n, sizeof(*a));
if (!a) return 1;
for (int i = 0; i < n; i++) printf("%d\n", a[i]);
free(a);
return 0;
}Indeksering af blokken
En pointer til en heap-blok opfører sig ligesom et arraynavn. Du kan bruge a[i] til at læse og skrive ethvert element fra 0 til n-1.
Internt er a[i] det samme som *(a + i).
int *a = malloc(3 * sizeof(*a));
a[0] = 1;
*(a + 1) = 2; /* same as a[1] = 2 */
a[2] = 3;Hold øje med grænserne
Hvis du allokerer n elementer, er gyldige indekser 0 til og med n-1. Skrivning til a[n] giver udefineret adfærd.
C kontrollerer ikke grænserne for dig, så en fejl med én position for meget kan ødelægge hukommelsen ubemærket.
int *a = malloc(3 * sizeof(*a));
a[2] = 99; /* OK, last valid index */
/* a[3] = 0; BUG: out of bounds */Læs størrelsen under kørsel
Den virkelige styrke er, at størrelsen kan komme fra input, en fil eller en beregning. Den samme kode kan allokere 2 eller 2 millioner elementer.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int n = 6; /* could be scanf'd */
long *a = malloc(n * sizeof(*a));
if (!a) return 1;
long sum = 0;
for (int i = 0; i < n; i++) { a[i] = i + 1; sum += a[i]; }
printf("%ld\n", sum);
free(a);
return 0;
}Hurtig kontrol
Test din forståelse af allokering.
Opsummering
Du allokerer et dynamisk array med malloc(n * sizeof(*p)) eller et nuludfyldt array med calloc(n, sizeof(*p)).
Kontrollér altid for NULL, husk at malloc efterlader tilfældige data, indeksér fra 0 til n-1, og par hver allokering med en free. Nu skal du lære at ændre størrelsen på en blok, mens du bevarer dens data.
Lær C med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 39
- Lektioner
- 144
Ofte stillede spørgsmål
Er lektionen “Allokér et array” gratis?
Ja — hele teksten til “Allokér et array” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C Academy-kurset, skal du opgradere til CoddyKit PRO. C Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Allokér et array”?
Reservér heap-hukommelse. Du øver dig i C Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C Academy?
Der kræves ingen tidligere erfaring. C Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Allokér et array”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C Academy-lektion?
Ja. Alle C Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.