Do tej pory uważałem, że jest, ale po tym, jak dowiedziałem się, że kompilator może podkładać dane, aby dostosować je do wymagań architektury, na przykład mam wątpliwości. Więc zastanawiam się, czy char[4][3]
ma taki sam układ pamięci, jak char[12]
. Czy kompilator może wstawić dopełnienie po części char[3]
, aby dopasować ją tak, aby cała macierz zajęła 16 bajtów?Czy jest zagwarantowane, że typ T [x] [y] ma taki sam układ pamięci co T [x * y] w C?
Historia tła, która funkcja biblioteki pobiera kilka ciągów o stałej długości w parametrze char*
, więc oczekuje ciągłego bufora bez paddig, a długość łańcucha może być nieparzysta. Tak więc pomyślałem, że deklaruję tablicę char[N_STRINGS][STRING_LENGTH]
, a następnie wygodnie zapełniam ją i przekazuję do funkcji, przesyłając ją do char*
. Jak dotąd wydaje się, że działa. Ale nie jestem pewien, czy to rozwiązanie jest przenośne.
Tablica jest przydzielana w sposób ciągły. Między elementami tablicy IMHO nie może być żadnego dopełnienia. – ameyCU
Macierze C muszą być przylegające, bez dopełnień między elementami tablicy. Zatem ani 'char [4] [3]', ani 'char [12]' może zawierać dopełnienie, a 'sizeof' będzie mieć rozmiar" 12 * sizeof (char) "dla obu. –
Zobacz również [Czy tablice C mogą zawierać dopełnienie między elementami?] (Http://stackoverflow.com/questions/1066681/can-c-arrays-contain-padding-in-between-elements) –