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, zi wmają 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ą newoperatora .
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::vectorw 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ą newoperatora, albo tablicę o nie ustalonym rozmiarze, używając np std::vector.