2012-02-23 12 views
39

Powiel możliwe:
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?Jak uzyskać długość tablicy w C? Czy "sizeof" jest rozwiązaniem?

Zobacz poniższy kod i sugerują mi, że to, co jest różnica "sizeof" słowo kluczowe, kiedy użyłem tak:

#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)); 
} 

Ale wyjście jest tak:

wyjściowa wynosi:

Długość: 10

Długość: 5

Długość: 2

Długość: 1

dlaczego się tak czuję; Jeśli chcę pobrać całe dane z jednej tablicy do innej, jak mogę to zrobić?

Zaproponuj mi Jeśli ktokolwiek wie.

+1

Nie można uzyskać rozmiaru tablicy w C bez dodatkowych informacji. – m0skit0

+0

@Oli Charlesworth: Szukałem w Google, ale nie dostałem tego linku, który podałeś; Dzięki za dostarczenie; – alishaik786

+0

Nie można pobrać rozmiaru parametru tablicy. –

Odpowiedz

60

Tablice rozpadają się na wskaźniki w wywołaniach funkcji. Nie można obliczyć rozmiaru tablicy, która w jakikolwiek sposób jest reprezentowana jako wskaźnik, w tym przy użyciu sizeof.

Należy dodać wyraźny argument:

void show(int *data, size_t count); 

W zaproszeniu, można użyć sizeof obliczyć liczbę elementów, dla rzeczywistych macierzy:

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

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

Zauważ, że sizeof daje Ci rozmiar w jednostkach char, dlatego potrzebny jest podział na to, co jest zasadniczo sizeof (int), inaczej uzyskałbyś zbyt wysoką wartość.

Należy również zauważyć, że jako punkt zainteresowania i czystość, sizeof jest , a nie funkcja. Nawiasy są potrzebne tylko wtedy, gdy argument jest nazwą typu, ponieważ wówczas argument jest wyrażeniem w rodzaju rzutowania (np. sizeof (int)). Często można uciec bez nazywania rzeczywistych typów, wykonując zamiast nich dane sizeof.

+1

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

+0

@Soran Dzięki, naprawione! – unwind

+0

Chociaż myślę, że jest to najlepsze ogólne rozwiązanie - tj. Przekazanie długości i tablicy - myślę, że warto również zauważyć, że dla tablic statycznych (tj. Długość nie zmienia się podczas wykonywania programu) najprostszym rozwiązaniem jest ustawienie rozmiaru tablicy w kodzie źródłowym z definicją preprocesora #define. Na przykład. #define ARRAY_SIZE 5 – Bill

1

show() przyjmuje adres tablicy przechowywanej na 2 bajtach. Pomyśl o tym jako o int * ar.

2

To powód, dla którego podczas pisania funkcji pobierającej tablicę deklarowane są dwa parametry. jeden, który jest wskaźnikiem do tablicy, drugi, który definiuje rozmiar tablicy.

Powiązane problemy