C’è qualche scorciatoia per la dimensione / lunghezza dell’array in C?

C’è un modo per velocizzare l’acquisizione di una dimensione dell’array in C?

Digitando sizeof(array)/sizeof(int) ogni volta diventa vecchio. .length libreria C ha qualcosa del tipo .length o c’è un modo per definire sizeof(array)/sizeof(int) come una costante più corta di qualche tipo (ansible anche usando la notazione dot)?

È ansible utilizzare sizeof(array)/sizeof(*array) e creare una macro.

 #define length(array) (sizeof(array)/sizeof(*(array))) 

Tutte le soluzioni in C si riducono a una macro:

 #define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0])) 

Potresti sempre scrivere una macro per farlo. Nota che non funzionerà come una funzione, dal momento che dovresti abbassare l’array in un puntatore al suo primo elemento, quindi restituirebbe solo sizeof(int *) / sizeof(int) .

 #define INTSIZE(array) (sizeof(array) / (sizeof(int)) 

O, più in generale …

 #define SIZE(array, type) (sizeof(array) / (sizeof(type)) 

Wow, downvotes. Va bene, questo funzionerà anche:

 #define SIZE(array) (sizeof(array) / (sizeof((array)[0])) 

La risposta breve è “no”; in C, non c’è modo di ottenere il numero di elementi in un array basato sulla sola espressione dell’array . La dimensione del trucco è all’incirca come si ottiene, e il suo uso è limitato alle espressioni del tipo di matrice. Quindi il seguente non funzionerà:

 char *foo = malloc(1024); size_t count = sizeof foo; 

count riceve il numero di byte per il tipo di puntatore (4 su una tipica architettura desktop), non nel blocco assegnato.

 char arr[100]; char *p = arr; size_t count = sizeof p; 

Come sopra.

 void foo(char *arr) { size_t count = sizeof arr; // same as above ... } void bar(void) { char array[100]; foo(array); ... } 

Come sopra.

Se hai bisogno di sapere quanti elementi ci sono in un array, devi tracciare le informazioni separatamente.

Il trattamento degli array di C è la fonte di molti bruciori di stomaco.