Ważne jest, aby mieć jasne definicje tego, co oznaczają terminy. Niestety wydaje się, że istnieje wiele definicji tego, co oznaczają tablice statyczne i dynamiczne.
Zmienne statyczne to zmienne zdefiniowane przy użyciu statycznej alokacji pamięci . To jest ogólna koncepcja niezależna od C / C ++. W C / C ++ możemy tworzyć zmienne statyczne o zasięgu globalnym, plikowym lub lokalnym w następujący sposób:
int x[10];
static int y[10];
foo() {
static int z[10];
Zmienne automatyczne są zwykle implementowane przy użyciu alokacji pamięci opartej na stosie . Tablicę automatyczną można utworzyć w C / C ++ w następujący sposób:
foo() {
int w[10];
Co te tablice, x, y, z
i w
mają wspólną cechą jest to, że wielkość dla każdego z nich jest stała i jest określona w czasie kompilacji.
Jednym z powodów, dla których ważne jest zrozumienie różnicy między tablicą automatyczną a tablicą statyczną, jest to, że statyczna pamięć jest zwykle zaimplementowana w sekcji danych (lub sekcji BSS ) pliku obiektowego, a kompilator może używać adresów bezwzględnych, aby uzyskać dostęp do tablic co jest niemożliwe w przypadku przechowywania na stosie.
Zwykle pod pojęciem tablicy dynamicznej nie rozumie się takiej, której rozmiar można zmieniać, ale zaimplementowaną przy użyciu dynamicznej alokacji pamięci o stałym rozmiarze określanym w czasie wykonywania. W C ++ odbywa się to za pomocą new
operatora .
foo() {
int *d = new int[n];
Ale możliwe jest utworzenie automatycznej tablicy z rozmiarem poprawek zdefiniowanym w czasie wykonywania za pomocą alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
W przypadku prawdziwej tablicy dynamicznej należy użyć czegoś takiego jak std::vector
w C ++ (lub tablicy o zmiennej długości w C ).
Co oznaczało zadanie w pytaniu PO? Myślę, że jest jasne, że to, co było pożądane, nie było tablicą statyczną lub automatyczną, ale taką, która albo wykorzystywała dynamiczną alokację pamięci za pomocą new
operatora, albo tablicę o nie ustalonym rozmiarze, używając np std::vector
.