Come si trova in fase di esecuzione la dimensione dell'array? dove sono archiviate le informazioni sulla dimensione dell'array o sui limiti della matrice?Come funziona sizeof (array)
risposta
sizeof(array)
è implementata interamente dal compilatore C. Nel momento in cui il programma viene collegato, quella che sembra una chiamata sizeof()
è stata convertita in una costante.
Esempio: quando si compila il codice C:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char** argv) {
int a[33];
printf("%d\n", sizeof(a));
}
si ottiene
.file "sz.c"
.section .rodata
.LC0:
.string "%d\n"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $164, %esp
movl $132, 4(%esp)
movl $.LC0, (%esp)
call printf
addl $164, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.2 (Gentoo 4.1.2 p1.1)"
.section .note.GNU-stack,"",@progbits
Il $132
in mezzo è la dimensione della matrice, 132 = 4 * 33. Si noti che non c'è no call sizeof
istruzione - a differenza di printf
, che è una funzione reale.
sizeof()
funziona solo per una matrice di dimensioni fisse (che può essere statica, basata su stack o in una struttura).
Se lo si applica a un array creato con malloc
(o nuovo in C++) si otterrà sempre la dimensione di un puntatore.
E sì, questo si basa sulle informazioni sulla compilazione del tempo.
Gli array di dimensioni fisse non sono necessariamente basati sullo stack. C non ha un nuovo operatore. – ysth
Hai ragione, modifico un po '. –
Hai dimenticato C99 VLA - array di lunghezza variabile. –
sizeof (Array) viene visualizzato in fase di compilazione, non in fase di esecuzione. Le informazioni non sono memorizzate.
Siete forse interessati a implementare il controllo dei limiti? Se è così, ci sono diversi modi per farlo.
sizeof
dà la dimensione della variabile, non la dimensione dell'oggetto che si sta indicando (se ce n'è uno.) sizeof(arrayVar)
restituirà la dimensione della matrice in byte se e solo se arrayVar
è dichiarata in ambito come array e non un puntatore.
Ad esempio:
char myArray[10];
char* myPtr = myArray;
printf("%d\n", sizeof(myArray)) // prints 10
printf("%d\n", sizeof(myPtr)); // prints 4 (on a 32-bit machine)
sizeof è tempo di compilazione puro in C++ e C prima di C99. A partire dalla C99 ci sono gli array di lunghezza variabile:
// returns n + 3
int f(int n) {
char v[n + 3];
// not purely a compile time construct anymore
return sizeof v;
}
che valuterà il sizeof
operando, perché n
non è ancora noto al momento della compilazione. Che solo si applica a matrici di lunghezza variabile: altri operandi o tipi eseguono ancora dimensioni di calcolo in fase di compilazione. In particolare, gli array con dimensioni note al momento della compilazione sono ancora gestiti come in C++ e C89. Di conseguenza, il valore restituito da sizeof
non è più una costante di tempo di compilazione (espressione costante). Non è possibile utilizzarlo quando è richiesto un valore di questo tipo, ad esempio quando si inizializzano variabili statiche, a meno che un'estensione specifica del compilatore lo consenta (lo standard C consente a un'implementazione di avere estensioni a ciò che considera come costante).
Bene quello lei parla di VLA C99. Tuttavia, la tua risposta dovrebbe sottolineare che anche in C99, gli array di dimensioni fisse hanno le loro dimensioni calcolate in fase di compilazione - sono solo VLA che hanno le loro dimensioni calcolate in fase di runtime. E forse, di conseguenza, non puoi sempre usare 'sizeof (array)' come costante in C99. –
oh giusto. non ho visto questa ambiguità nella mia risposta. –
ok, ora di dormire per me ora. più tardi mi sveglierò e urlerò di tutti quegli errori di battitura nelle mie risposte: p –
- 1. Come sizeof (array) funziona in fase di runtime?
- 2. Array of struct e sizeof
- 3. Come funzionano sizeof (arr)/sizeof (arr [0])? persone
- 4. Uso sizeof con un array allocato dinamicamente
- 5. Uso rapido sizeof con Int32 Array
- 6. Semplice printf con sizeof non funziona affatto
- 7. Come funziona sizeof? Come posso scrivere il mio?
- 8. Come funziona la funzione sizeof() per Structures in C?
- 9. dimensioni Ricerca di array senza utilizzare sizeof in C
- 10. Swift: come usare sizeof?
- 11. Come capire "C++ consente sizeof (char *)! = Sizeof (int *)"?
- 12. Risultato di 'sizeof' su array di strutture in C?
- 13. Utilizzo di sizeof() nelle dichiarazioni di array in C89
- 14. Come funziona l'espressione -2 [array]?
- 15. operatore di incremento che non funziona con sizeof
- 16. Qual'è la dimensione di (main), sizeof (printf), sizeof (scanf)?
- 17. Perché sizeof (int) è diverso da sizeof (int *)?
- 18. Sizeof struct in Go
- 19. sizeof errore membro di calcolo
- 20. C# sizeof decimal?
- 21. sizeof modello variadic (somma di sizeof di tutti gli elementi)
- 22. Ho la garanzia che sizeof (type) == sizeof (tipo senza segno)?
- 23. implementare il proprio sizeof
- 24. Perché `{} .toString.apply (array)` funziona?
- 25. Come funziona l'inizializzatore std :: array per char?
- 26. Sizeof vs STRLEN
- 27. stringa Sizeof letterale
- 28. sizeof() std :: vector (C++)
- 29. Sizeof classe vuota
- 30. operatore sizeof() in C
lol! Questo mi insegnerà a non controllare di aver messo le mie mani nel posto giusto ...grazie per la correzione Rob –
Ah, ora capisco, David deve essere un dattilografo cieco con una disfunzione tattile alle estremità delle dita :-) Divertente come la c ed e andava bene - ho dovuto controllare che ogni altra lettera fosse uno a sinistra della posizione corretta. – paxdiablo
Immagino che la mia mano sinistra fosse nel posto giusto ma la mia mano destra è stata spostata di una chiave a sinistra ... sembra un errore facile da fare - se stai scrivendo una risposta mentre guardi la TV ;-) –