08/08/09 17:48
puffin
Quando devo dichiarare un array di cui non conosco le dimenzione, si usa l'operatore new per allocare memoria a run-time;
Se invece dichiaro l'array di cui non conosco le dimenzioni in questo modo
int n;
cin>>n;
int array[n];
a me funziona lo stesso, ma il prof mi ha raccomandato di farlo con la new,
qual'è la differenza?
aaa
08/08/09 19:32
manvb.net
Usi il dev-cpp? E' un problema del g++ (contenuto in dev-cpp) che non segnala l'errore. In realtà
int a;
int b[a];
equivale a
int b[1];
quindi se usi questo metodo e vai più lontano dell'indice 0 si verifica un buffer overflow, è molto pericoloso.
aaa
09/08/09 10:37
puffin
cioè il problema è del dev-c++?
aaa
09/08/09 10:57
puffin
#include <iostream>
using namespace std;
int main(){
int x;
cin >> x;
int arr[x];
int j=sizeof(arr);
cout<<j;
system("pause"
;
}
compilando questo codice a me non risulta che
int b[a]
a corrisponda a 1
a me "sputa" fuori il numero della memoria allocata in base alla dimenzione dell' array
Ultima modifica effettuata da puffin 09/08/09 11:05
aaa
09/08/09 14:23
manvb.net
No, errore mio, mi sono documentato meglio e ho scoperto che questa è una caratteristica dello standard C99, si chiama VLA(Variable-Length Array).
Il tuo professore ti ha sconsigliato di usarla perchè è mal implementata in molti compilatori e in alcuni è assente(Visual c++ ad esempio), ma il g++(e di conseguenza il dev-c++) la supporta pienamente.
Altra caratteristica del C99 non supportata da tutti i compilatori è il sizeof dinamico(usato sugli array dinamici) come quello che hai utilizzato nel codice sopra.
Ultima modifica effettuata da manvb.net 09/08/09 21:23
aaa
10/08/09 8:55
theprogrammer
Infatti ... Lo standard C99 prevede i VLA ma a questo standard non aderiscono molti compilatori.
Dato che, al contrario, l'allocazione dinamica con new / delete è supportata come standard con qualsiasi compilatore, e' ovvio che il tuo professore ti abbia indirizzato su questa strada.
Fra l'altro, faccio notare, una scrittura del tipo
int a;
char x[a];
non ha senso (ed e' pericolosa) perche' le variabili non sono inizializzate e il loro valore e' casuale. Quindi il valore di a non sarà prevedibile (non sarà 0) e il compilatore potrebbe avere molti problemi con la dichiarazione seguente.
aaa