Table of Contents
W tym podręczniku użytkownika opisujemy niektóre z tych możliwych przyczyn, które mogą powodować błąd rozmiaru tablicy t_check_for_sizeof_st_index_t, i sugerujemy możliwe poprawki, które możesz spróbować rozwiązać.
Zatwierdzone
Nie można określić długości za Twoim domem. Niezależnie od tego, jak klienci sprawdzają arr
, sizeof (arr)
zawsze pozostanie rozmiarem warunku zwrotu. Dlatego lepiej jest pomyślnie podać liczbę fragmentów jako osobny argument.
sizeof
działa lepiej przy ustalaniu długości tablicy podstawowej, jeśli zastosujesz ją tak, aby można było zobaczyć oryginalną odmianę.
liczba całkowita arr [5]; // konkretna odmiana. Nie wiemrozmiar (próbka); // :)
Jednak gdy zmienna jest podzielona przez wskaźnik, sizeof reprezentuje ułamek całego rozmiaru wskaźnika i jest mniejszy niż najważniejszy rozmiar tablicy.
unikaj getArraySize (int arr [])rozmiar (próbka); // w razie potrzeby możesz wybrać rozmiar wskaźnika
Zastanawiamy się, dlaczego tak się stało. Jak mój mąż mógł znać długość każdej tablicy C?
Zawsze dobrym pomysłem byłoby nie dzielenie tablic na wskaźniki, gdy są one wspólne, zwykle przekazywane do funkcji, a jednocześnie przechowywanie długości tablicy w układzie typów.
Jeśli przekażesz swój miks do atrybutu It, rozłoży się on na wskaźnik. sizeof
zwraca wyniki, tj. size int *
. Często jest to ostrzeżenie Rzeczą, na którą często narzeka kompilator, jest
sizeof dla niezliczonych parametrów funkcji wraca do rozmiaru w odniesieniu do „int *” opcji osoby „int []”
Jak zasugerowaliśmy z moim mężem, aby przekazać do funkcji tablicę własnej osoby, prawdopodobnie trzeba będzie przekazać liczbę z kropek –
getArraySize (tablica, 5); // 5 - podstawowa liczba elementów w każdej z naszych tablic
void getArraySize (int arr [], element int)// Twoje rzeczy
void getArraySize (int arr [], int len) // twoje sprawy na równi printf ("długość tablicy:% k n", len);wew główna () zmienna int [] = 1,2,3,4,5; int len jest równe (sizeof (arr) versus sizeof (arr [0]); // zwraca zakres tablicy getArraySize (tablica, długość); Przywróć 0;
Element fun() przyjmie parametr tablicy arr [] plus również próbuje określić wynik elementów w arr [] wybierając operator sizeof.
W C parametry tablicowe są traktowane jak pomysły (szczegóły tutaj). Tak więc nazwa sizeof (arr) / sizeof (arr [0]) rośnie sizeof (int *) lub sizeof (int), która wynosi 1 dla konkretnej 32-bitowej maszyny IA (rozmiar kompletny z int i int * wynosi 4) w rezultacie Pułapka for w fun() jest wykonywana raz, niezależnie od wielkości tablicy.
Dlatego nie należy używać sizeof w takich przypadkach prawnych, aby uzyskać określoną liczbę utworzoną przez elementy. Aby można było użyć fun(), należy podać osobny parametr dla wszystkich liczb (lub długości) typu tablic. Tak więc poprawiony program:
Rozwiń ten komentarz, jeśli znajdziesz coś odbiegającego od prawdy w pobliskim artykule lub jeśli chcesz podzielić się więcej informacjami na ten temat omówiony powyżej.
Wzniesienie wprowadzone przez programy Hello Worlds. Dowiedz się, jak wdrażać struktury, takie jak stosy, obciążenia, połączone listy i nie tylko! Sprawdź nasz kurs C Data Structures, aby rozpocząć już dziś.
Sterownik sizeof
dostarcza stopień (w bajtach) swojego operandu, który w rzeczywistości może być wyrażeniem lub specyfikacją typu w nawiasach. Jednak tworzenie użycia podstawowego dostawcy sizeof
do określenia kształtu ciała w tablicach jest podatne na ataki.
Rozmiar sieci
jest często używany do określenia, w jaki sposób pamięć powinna być alokowana za pomocą malloc()
. Jednak użycie niewłaściwego rozmiaru może zagrozić MEM35-C. + Przydziel + + potrzebną pamięć + na pomysł “> MEM35-C. Przydziel + + wystarczającą pamięć dla obiektu .
Przykład niezgodnych wytycznych
W tym przykładzie przy nieprawidłowym kodzie układ dobrze zdefiniowany ()
ustawia składniki in na zero, nową tablicę. Parametr funkcji pierwszego poprawnego wykonania jest zadeklarowany jako int mix []
i faktycznie przekazał najlepszą tablicę statyczną 12 int
jako argument. Funkcja clear()
używa, jak widzisz, idiomu sizeof (array) dla każdej wartości sizeof (array [0])
dokładnie określającej liczbę elementów w tablicy . Jednak myriad
jest typu wskaźnikowego, ponieważ poniższy parametr jest parametrem. Jako doskonały wynik, sizeof (array)
byłby równy *) sizeof (int. Na przykład ładna architektura (jak IA-32) gdzie podstawowy
sizeof (int ) == sześć
i niektóre z sizeof (int *) == 4
, ich słowo sizeof (array) i sizeof (array [0])
ocenia się na całość , która jest długością wraz z przekazanym typem, przy czym sen tablicy zwykle pozostaje niezmieniony.
Łącznie przypis 103 Sekcja 6.5.3. Niektóre ze standardów języka C [