Oppure

Loading
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