Historia pytania
W języku C praca z tablicami to podstawowy aspekt programowania. C oferuje dwa główne typy tablic: statyczne (rozmiar znany na etapie kompilacji, przydzielane na stosie lub w statycznym/globalnym obszarze pamięci) oraz dynamiczne (rozmiar określany w czasie wykonywania). Statyczne tablice używane są od momentu powstania języka C, podkreślając wydajność i prostotę.
Problem
Brak zrozumienia różnice między tablicami statycznymi a dynamicznymi może prowadzić do błędów: przekroczenia granic tablicy, niezwolnienia pamięci lub błędów związanych z zarządzaniem cyklem życia danych. Niewłaściwa inicjalizacja statycznych tablic może prowadzić do odczytu odrzuconych lub nieinicjalizowanych danych.
Rozwiązanie
Deklaracja statycznej tablicy wygląda tak:
int arr[5] = {1, 2, 3, 4, 5};
Przy tym, rozmiar i zawartość tablicy są określane na etapie kompilacji, pamięć przydzielana jest na stosie (dla lokalnych tablic automatycznych) lub w pamięci statycznej (przy deklaracji tablicy jako static lub globalnej). Szczególną uwagę warto zwrócić na częściową inicjalizację, gdy nieokreślone elementy są wypełniane zerami.
Statycznej tablicy nie można zmienić podczas wykonywania programu, co odróżnia ją od dynamicznej.
Kluczowe cechy:
1. Co się stanie, jeśli wyraźnie nie zainicjalizujesz statycznej tablicy w funkcji?
Lokalne automatyczne (auto) tablice statyczne mają nieinicjalizowane elementy z nieokreślonymi wartościami. Jednak jeśli tablica została zadeklarowana z modyfikatorem static lub jako globalna, wszystkie elementy będą domyślnie zainicjalizowane zerami.
Przykład:
void foo() { int arr1[3]; // Wartości nieokreślone! static int arr2[3]; // Wszystkie elementy równe 0 }
2. Czy można przekazać statyczną tablicę do funkcji w taki sposób, aby funkcja mogła zmienić jej rozmiar?
Nie, rozmiaru statycznej tablicy nie można zmienić — jest ustalony podczas deklaracji. Funkcja może pracować z jej zawartością, ale nie z rozmiarem.
Przykład poprawnego przekazania tablicy:
void processArray(int arr[], int size) { arr[0] = 42; }
3. Co się stanie, gdy wyjdziesz poza granice statycznej tablicy? Czy wystąpi błąd czasu wykonywania?
Nie, język C nie przeprowadza kontroli wyjścia poza granice tablicy. Takie zachowanie uważane jest za undefined behavior i może prowadzić do awarii, uszkodzenia danych lub ukrytych błędów.
Programista deklaruje lokalną tablicę, zapomina ją zainicjalizować, a następnie używa w pętli. Program zwraca różne wyniki przy każdym uruchomieniu, czasami występuje błąd w etapie odczytu.
Zalety:
Wady:
Programista albo wyraźnie inicjalizuje tablicę wartościami, albo deklaruje ją jako static dla automatycznej inicjalizacji zerami. Zawsze kontroluje rozmiar i granice przy użyciu tablicy.
Zalety:
Wady: