È importante avere definizioni chiare del significato dei termini. Sfortunatamente sembrano esserci più definizioni del significato di array statici e dinamici.
Le variabili statiche sono variabili definite utilizzando l'allocazione della memoria statica . Questo è un concetto generale indipendente da C / C ++. In C / C ++ possiamo creare variabili statiche con scope globale, file o locale come questo:
int x[10];
static int y[10];
foo() {
static int z[10];
Le variabili automatiche vengono solitamente implementate utilizzando l' allocazione della memoria basata sullo stack . Un array automatico può essere creato in C / C ++ in questo modo:
foo() {
int w[10];
Ciò che questi array, x, y, z
e w
hanno in comune è che la dimensione di ciascuno di essi è fissa ed è definita in fase di compilazione.
Uno dei motivi per cui è importante comprendere la distinzione tra un array automatico e un array statico è che l'archiviazione statica è solitamente implementata nella sezione dati (o sezione BSS ) di un file oggetto e il compilatore può utilizzare indirizzi assoluti per accedere agli array cosa impossibile con l'archiviazione basata su stack.
Ciò che di solito si intende per array dinamico non è ridimensionabile ma implementato utilizzando l'allocazione dinamica della memoria con una dimensione fissa determinata in fase di esecuzione. In C ++ questo viene fatto usando l' new
operatore .
foo() {
int *d = new int[n];
Ma è possibile creare un array automatico con una dimensione delle correzioni definita in fase di esecuzione utilizzando alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
Per un vero array dinamico si dovrebbe usare qualcosa come std::vector
in C ++ (o un array a lunghezza variabile in C ).
Cosa si intendeva per l'assegnazione nella domanda del PO? Penso che sia chiaro che ciò che si desiderava non era un array statico o automatico ma uno che utilizzava l'allocazione dinamica della memoria utilizzando l' new
operatore o un array di dimensioni non fisse utilizzando ad es std::vector
.