FAQ -C-programmering

Hvor finner jeg et API for C slik Java har?

Du finner ikke helt det samme for C. Under dokumentasjon på orakelsiden er det en link til en side som lister opp mye nyttig info om C. Ellers er det beste tipset å søke på nettet, bruke man-sidene eller slå opp i en bok om C. Gode sider på nettet er wikipedia og linuxmanpages.com. Det går fint å søke på wikipedia, men det kan være greit å starte med artikkelen C_standard_library.

Hva betyr - error: dereferencing pointer to incomplete type?

Det betyr som regel at du prøver og bruke en struct, men har glemt og definere den. Husk alltid å inkludere (include) de korrekte headerfilene.

Hvordan sammenligner jeg strukter?

Du må sammenligne hvert element i struktene, hver for seg.

Hva er segmentation fault?

Ulovlig lesing eller skriving til minnet. Les mer her: http://en.wikipedia.org/wiki/Segmentation_fault

*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0848d4f0 ***

Det står forklart hva som er problemet. free kalles to ganger med samme peker, dvs. at du prøver å frigjøre et minneområdet som allerede er frigjort.

Hva betyr "implicit function declaration"?

Det betyr vanligvis at du har glemt å inkludere en header-fil øverst i programmet (#include). Bruk man-sidene for å finne hvilke header-filer hver funksjon krever.

Hva betyr "assignment type mismatch" og "incompatible types in assignment"?

Disse feilmeldingene kommer når du prøver å sette verdien av en peker til en variabel som ikke er en peker. F.eks. slik:

double d;
int *i;
d = i;

Hva betyr "initialization makes pointer from integer without a cast"?

Denne feilmeldingen kommer når du prøver å gi en pekervariabel en verdi som ikke er en peker (f.eks. int *u = 10; ).

Jeg prøver å bruke <math.h>, men får feilmeldingen "undefined reference to ....". Jeg har inkludert math.h så hva er galt?

Du må fortelle kompilatoren at du skal bruke mattebilblioteket (libm). I gcc ser dette slik ut: "gcc -lm prog.c". Årsaken til at du ikke trenger å bruke dette for de vanlige header-filene slik som stdio.h er at de ligger i libglibc som alltid linkes med programmene dine.

Hvorfor viser ikke sizeof riktig størrelse på minneområdet?

char *mem = malloc(sizeof(struct Data))
printf("Size:%d\n", sizeof(mem));

Man skulle kanskje tro at det som skrives ut ville være størrelsen på struct Data, men det er det ikke. sizeof er ingen magisk funksjon som finner størrelsen på det allokerte minneområdet. Når du sender med en peker til sizeof, vil den fortelle deg hvor mange byte denne pekeren bruker, nemlig 8 byte (64bit) eller 4 byte (32bit). Størrelsen på minneområdet må du holde styr på selv.

Jeg vil konvertere en int til en string med metoden itoa, men funksjonen finnes ikke!

Hvis man søker på nettet etter en funksjon som skal konvertere en int til en string nevnes ofte metoden itoa, men denne metoden er ikke ANSI C. En halv-god erstatning til itoa er sprintf, (se man sprintf)