2012-02-23 13 views
39

Eventuali duplicati:
Sizeof an array in the C programming language?
Why does a C-Array have a wrong sizeof() value when it's passed to a function?Come ottenere la lunghezza di un array in C? "Sizeof" è una soluzione?

vedere il codice qui sotto e mi suggeriscono che ciò che è la differenza di "sizeof" parola chiave quando ho usato in questo modo:

#include<stdio.h> 
#include<conio.h> 
void show(int ar[]); 
void main() 
{ 
    int arr[]={1,2,3,4,5}; 
    clrscr(); 
    printf("Length: %d\n",sizeof(arr)); 
    printf("Length: %d\n",sizeof(arr)/sizeof(int)); 
    show(arr); 
    getch(); 
} 
void show(int ar[]) 
{ 
    printf("Length: %d", sizeof(ar)); 
    printf("Length: %d", sizeof(ar)/sizeof(int)); 
} 

Ma l'uscita è come questo:

uscita è:

Lunghezza: 10

Lunghezza: 5

Lunghezza: 2

Durata: 1

perché sto diventando così; Se voglio prendere l'intero dato da un array ad un altro array, come posso fare?

me Suggerisci Se qualcuno sa.

+1

Non è possibile ottenere la dimensione di un array in C, senza ulteriori informazioni. – m0skit0

+0

@Oli Charlesworth: ho cercato su google ma non ho ricevuto il link che hai fornito; Grazie per aver fornito; – alishaik786

+0

Non è possibile ottenere la dimensione di un parametro di matrice. –

risposta

60

Gli array decadono ai puntatori nelle chiamate di funzione. Non è possibile calcolare la dimensione di un array rappresentato solo come puntatore in qualsiasi modo, incluso l'uso di sizeof.

È necessario aggiungere un argomento esplicito:

void show(int *data, size_t count); 

Nella chiamata, è possibile utilizzare sizeof per calcolare il numero di elementi, per gli array attuali:

int arr[] = { 1,2,3,4,5 }; 

show(arr, sizeof arr/sizeof *arr); 

Nota che sizeof ti dà la dimensioni in unità di char, motivo per cui la divisione per quello che è essenzialmente è necessario sizeof (int), oppure si otterrebbe un modo troppo alto valore.

Inoltre, come punto di interesse e pulizia, è sizeofnon una funzione. Le parentesi sono necessarie solo quando l'argomento è un nome di tipo, poiché l'argomento è quindi un'espressione simile a un cast (ad esempio sizeof (int)). Puoi spesso andare via senza nominare i tipi reali, facendo invece il sizeof sui dati.

+1

mostra (arr, sizeof arr/sizeof * arr); – Soran

+0

@Soran Grazie, risolto! – unwind

+0

Anche se penso che questa sia la migliore soluzione generale - vale a dire passare la lunghezza e l'array - penso che valga anche la pena notare che per gli array statici (cioè la lunghezza non cambia durante l'esecuzione del programma) la soluzione più semplice è impostare la dimensione dell'array nel codice sorgente con una definizione del preprocessore #define. Per esempio. #define ARRAY_SIZE 5 – Bill

1

show() prende l'indirizzo dell'array che è memorizzato su 2 byte. Pensalo come int * ar.

2

Questo è il motivo per cui, quando si scrive una funzione che accetta un array, vengono dichiarati due parametri. uno che è un puntatore all'array, l'altro che definisce la dimensione dell'array.

Problemi correlati