Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Dubbi dichiarazioni di  array nello Stack
Forum - C/C++ - Dubbi dichiarazioni di array nello Stack

Avatar
puffin (Normal User)
Rookie


Messaggi: 30
Iscritto: 18/07/2009

Segnala al moderatore
Postato alle 19:48
Sabato, 08/08/2009
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?


Solo Puffin ti dà Forza e Grinta a Volontà
------------------------------------------
Dijkstra:"I collaudi mostrano la presenza di errori, non la loro assenza.
Non si può provare che un progamma è corretto, ma solo che è scorretto"

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 21:32
Sabato, 08/08/2009
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.


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
puffin (Normal User)
Rookie


Messaggi: 30
Iscritto: 18/07/2009

Segnala al moderatore
Postato alle 12:37
Domenica, 09/08/2009
cioè il problema è del dev-c++?


Solo Puffin ti dà Forza e Grinta a Volontà
------------------------------------------
Dijkstra:"I collaudi mostrano la presenza di errori, non la loro assenza.
Non si può provare che un progamma è corretto, ma solo che è scorretto"

PM Quote
Avatar
puffin (Normal User)
Rookie


Messaggi: 30
Iscritto: 18/07/2009

Segnala al moderatore
Postato alle 12:57
Domenica, 09/08/2009

#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 il 09/08/2009 alle 13:05


Solo Puffin ti dà Forza e Grinta a Volontà
------------------------------------------
Dijkstra:"I collaudi mostrano la presenza di errori, non la loro assenza.
Non si può provare che un progamma è corretto, ma solo che è scorretto"

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 16:23
Domenica, 09/08/2009
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 il 09/08/2009 alle 23:23


"E' facile distruggere, la vera sfida è creare!"(cit. me)

"Ricordati chi sei, non permettere a nessuno di cambiarti, non perdere mai te stesso. Farai grandi cose nella vita."(cit. me)

double penetration; //ouch
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 10:55
Lunedì, 10/08/2009
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.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote