Avatar billede Slettet bruger
20. december 2005 - 13:52 Der er 18 kommentarer og
2 løsninger

Spørgsmål omkring anvendelse af sizeof i C

Hvordan anvendes sizeof i forbindelse med arrays i C?

sizeof array[8192] eller?
Avatar billede erikjacobsen Ekspert
20. december 2005 - 13:56 #1
int[100] a;

så kan du bruge:  sizeof(a)
Avatar billede Slettet bruger
20. december 2005 - 14:03 #2
Det er sådan at i en funktion oppe i koden står der

int test[8192];

men når funktionen er afsluttet har jeg brug for at fortælle at en funtion hvorlang test er....
så derfor kan jeg desværre ikke gøre som du foreslår.
Avatar billede erikjacobsen Ekspert
20. december 2005 - 14:04 #3
sizeof(test)    ?
Avatar billede erikjacobsen Ekspert
20. december 2005 - 14:06 #4
Eller mener du at navnet ikke er tilgængeligt hvor du skal bruge størrelsen? Men hvis du får arrayet ud af din funktion, kan du jo også få størrelsen med ud som en int.

Ellers kan du regne det ud selv:  sizeof(int)*8192
men det er et hack, da du nu skal rette 2 steder, hvis det ændrer sig.
Avatar billede erikjacobsen Ekspert
20. december 2005 - 14:14 #5
Men hvis du erklærer dit array på den måde i din funktion, så ligger det på stakken, og kan ikke returneres af funktionen - stakken kan blive overskrevet af noget andet.
Avatar billede Slettet bruger
20. december 2005 - 14:22 #6
jeg får
Error: test undeclared her (not in a function)

Men kan jeg ikke bare skrive et eller andet som fortæller den at den skal tage størrelsen af et array på 8192?
Avatar billede Slettet bruger
20. december 2005 - 14:32 #7
kan sizeof(8192) være svaret?
Avatar billede erikjacobsen Ekspert
20. december 2005 - 14:57 #8
Nej, jeg skrev det før:  sizeof(int)*8192

Men du skal passe på det med stakken, som jeg også skrev.
Avatar billede arne_v Ekspert
20. december 2005 - 15:03 #9
int test[8192];

sizeof(test) vil returnere 32768

sizeof(test)/sizeof(int) vil returnere 8192
Avatar billede datasource Nybegynder
20. december 2005 - 15:08 #10
Det er rigtigt hvad arne_v siger da en int (som regel) fylder 4 bytes.
Så:
int test[8192];
sizeof(test);  // er størrelsen I BYTES på test
sizeof(test)/sizeof(int);  // er antal integers (8192)
Avatar billede Slettet bruger
20. december 2005 - 15:41 #11
vil det tage lang tid at fylde et array på 8k med tal?? Snakker vi ikke her om ms?? Det er en 60MHz maskine....
Avatar billede arne_v Ekspert
20. december 2005 - 15:44 #12
snarere us (mikro sekunder)

også selvom det er en 60 MHz
Avatar billede Slettet bruger
20. december 2005 - 15:48 #13
okay.... nederen.... men tak for alle jeres svar..... husk lige at lave et svar :)
Avatar billede arne_v Ekspert
20. december 2005 - 15:50 #14
er du ked af at det går hurtigt ?
Avatar billede Slettet bruger
20. december 2005 - 16:00 #15
nej kun godt :)

husk at lave et svar arne
Avatar billede bertelbrander Novice
20. december 2005 - 20:19 #16
Et lille eksempel:

#include <iostream>
void foo(int array[1023])
{
  std::cout << sizeof(array) << std::endl;
}
void bar(int *p)
{
  std::cout << sizeof(0) << std::endl;
}
int main()
{
  std::cout << sizeof(8192) << std::endl;
  int a[1023];
  foo(a);

  int *z = new int [123];
  bar(z);
  delete [] z;
}

På min pc skriver det:
4
4
4

sizeof(8192) er der samme som sizeof(int) da 8192 er en int
I både foo og bar får man sizeof(int *), hvilket viser at man ikke kan overføre et array til en funktion (der overføres en pointer) og man kan ikke vide hvor meget hukommelse der er allokeret med new (eller malloc).
Avatar billede arne_v Ekspert
21. december 2005 - 08:28 #17
bertel>

jeg forstår ikke helt dit eksempel i konteksten
Avatar billede arne_v Ekspert
21. december 2005 - 08:28 #18
og et svar
Avatar billede bertelbrander Novice
21. december 2005 - 20:11 #19
>Arne, det startede som en kommentar til "20/12-2005 14:32:17", jeg inkluderede så et par andre eksempler der viser nogle af sizeof's begrænsninger.
Avatar billede arne_v Ekspert
22. december 2005 - 01:49 #20
så er jeg med
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester