Un puntatore è quello che hai usato per restituire il tuo array. E' una variabile che contiene un indirizzo in memoria. Se questo indirizzo non è valido, allora la tua applicazione andrà in crash con l'errore
segmentation fault. Ogni variabile ha una sua vita/durata che è determinata dal blocco in cui si trova (qualcosa delimitato da parentesi graffe). Se definisci una variabile all'interno di una funzione, questa variabile non esisterà più una volta che l'esecuzione della funzione è terminata. Il corrispondente indirizzo di memoria sarà quindi invalido e accedervi porta ad un crash del programma come è successo nel tuo caso.
Quando passi un array ad una funzione o lo restituisci da essa, l'array diventa un puntatore al suo primo elemento. La vita della variabile non viene però incrementata. L'array terminerà di esistere in ogni caso alla fine del blocco di codice che lo contiene e quindi il puntatore che restituisci sarà invalido.
L'allocazione dinamica della memoria permette di avere blocchi di memoria che hanno un vita più lunga del blocco che li contiene. La durata di questa memoria parte da quella che viene chiamata "allocazione" (la riga con new che non capisci) e la sua deallocazione (la riga con delete). Se non puoi usare tale funzionalità del linguaggio allora l'unica possibilità è quella di usare la funzione solo per l'inizializzazione dei valori e non per la creazione della variabile.
Qualcosa come il seguente (nota che rimane il commento sul fatto che non è standard):
- Codice:
#include <iostream>
void costruzione(float *a, int i, int v)
{
for (int x = 0; x < i; x++) {
std::cout << "Inserire la componente numero " << x + 1 << " del vettore numero " << v << std::endl;
std::cin >> a[x];
}
}
int main ()
{
std::cout << "Inserire la dimensione del vettore" << std::endl;
int i;
std::cin >> i;
float a[i];
costruzione(a, i, 1);
float b[i];
costruzione(b, i, 2);
for (int j = 0; j < i; j++) {
std::cout << a[i] + b[i] << std::endl;
}
}