Disclaimer: Τη χρονική στιγμή που έγινε η ερώτηση, στο μάθημα progintro δεν έχουμε ακόμη φτάσει στα arrays.
Και τα δύο παραπάνω είναι σωστά στη C++. (Edit: Δες στο τέλος για μια ακριβέστερη απάντηση.) Η διαφορά τους είναι ότι το πρώτο δημιουργεί το array ως τοπική μεταβλητή μέσα στη συνάρτηση όπου βρίσκεται αυτός ο κώδικας (δηλαδή στη στοίβα), ενώ το δεύτερο το δημιουργεί ως δυναμική μεταβλητή (δηλαδή στο heap) και βάζει ένα δείκτη να δείχνει σε αυτό.
Ο λόγος που το δεύτερο είναι προτιμότερο είναι γιατί, αν η τιμή του n
είναι μεγάλη, το array δε θα χωράει στη στοίβα και το πρόγραμμά σας θα τερματιστεί με κάποιο μήνυμα σφάλματος. Όμως, στο δεύτερο πρέπει ο προγραμματιστής να αποδεσμεύσει το χώρο του array, όταν δεν το χρειάζεται πια, κάνοντας delete [] array;
. Αυτό είναι ένα μειονέκτημα αυτής της επιλογής.
Συμβουλή για τις ασκήσεις στον grader που προϋποθέτουν κάτι σαν το παραπάνω (να οριστεί ένας πίνακας με μήκος που καθορίζεται από το input): προτιμήστε μία από τις παρακάτω δύο επιλογές:
Χρησιμοποιήστε global array. Θα χρειαστεί να δείτε στην εκφώνηση της άσκησης ποιο είναι το μέγιστο μήκος του πίνακα (π.χ. 1000000 εδώ).
int array[1000000];
PROGRAM {
int N = READ_INT();
int i;
FOR(i, 0 to N-1) array[i] = READ_INT();
// whatever...
}
ή χωρίς το pzhelp
και λίγο καλύτερα:
#define MAXN 1000000
int array[MAXN];
int main() {
int N;
cin >> N;
for (int i = 0; i < N; ++i) cin >> array[i];
// whatever...
}
Χρησιμοποιήστε vector
(όχι για το progintro, το μαθαίνουμε στο 2ο εξάμηνο):
#include <vector>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> array(N);
for (int i = 0; i < N; ++i) cin >> array[i];
// whatever...
}
Edit: Τα arrays μεταβλητού μήκους δεν υποστηρίζονται από το standard της ISO C++. Δείτε μια σχετική συζήτηση στο SO. Όμως, υπάρχουν στη C99 και, μάλλον γι' αυτό, υποστηρίζονται από τον GNU C++ compiler και από τον clang++. Γι' αυτό στην αρχή του post γράφω ότι και τα δύο είναι σωστά στη C++. Αν θέλουμε να είμαστε αυστηροί, το πρώτο δεν είναι σωστό σύμφωνα με το ISO standard.