Τι θα εκτυπώσει;

Ακολουθώντας το παράδειγμα το Γιώργου, τι θα εκτυπώσει το παρακάτω πρόγραμμα;

#include <stdio.h>

int
main(int argc, char *argv[])
{
int i;
char a[12];

for ( i = 0; i <= 12; i++ )
{
a[i]=i-1;
}

printf("a[12] is %d\n", a[12]);

return 0;
}

Σε τυχόν απάντηση αναφέρατε υπολογιστική πλατφόρμα (π.χ. GNU/Linux, x86)

Ενημέρωση Διόρθωσα ένα συντακτικό σφάλμα από τη μετατροπή στο WordPress (ύπαρξη διαστήματος μεταξύ < και = στο βρόχο).

Ενημέρωση #2 Απλούστευσα λίγο ακόμα το πρόγραμμα. Όταν το εκτελέσετε, τι τυπώνει η εντολή printf;

15 comments

  • Σεραφείμ

    Ο compiler (έκδοση gcc 3.3.5 (Debian 1:3.3.5-8ubuntu2), x86) βγάζει συντακτικό λάθος λόγω του κενού μεταξύ των συμβόλων του τελεστή “

  • Σεραφείμ

    ΟΚ λάθος μου, ξέχασα ότι πρέπει να escape το σύμβολο μικρότερο λόγω HTML :-/

    Τελευταία δοκιμή με pre tag.

    Ή έξοδος του compiler είναι:

    $ gcc a.c
    a.c: Στη συνάρτηση `main’:
    a.c:7: error: σφάλμα σύνταξης before ‘=’ token
    a.c:7: error: σφάλμα σύνταξης before ‘)’ token
    a.c: At top level:
    a.c:11: error: σφάλμα σύνταξης before string constant
    a.c:11: προειδοποίηση: conflicting types for built-in function `printf’
    a.c:11: προειδοποίηση: data definition has no type or storage class

    Λειτουργεί αφαιρώντας το κενό μεταξύ των συμβόλων

  • Σεραφείμ

    … των συμβόλων μικρότερο και ίσον και εμφανίζει το αναμενόμενο αποτέλεσμα (7)

    (το pre δεν δούλεψε, σόρρυ που σου γέμισα το blog με κομμένα σχόλια 🙂

  • Simos

    🙂

    Όντως υπήρξε ένα πρόβλημα με την μετατροπή του κωδικά σε HTML για την εμφάνιση στο ιστολόγιο. Προστέθηκε ένα διάστημα μεταξύ του < και του =.

    Το διόρθωσα και τώρα επιβεβαίωσα ότι με αντιγραφή/επικόλληση να πάρεις το πρόγραμμα και να το μεταγλωττίσεις ορθά.

  • Simos

    Να πω ότι το ερώτημα δεν έχει απαντηθεί ακόμα.

    Ποια είναι η τιμή που πρέπει να έχει το a[10] και όταν εκτελέσετε το πρόγραμμα, τι εκτυπώνει;

  • Simos

    Εμ, αυτό είναι το κουίζ. 😉

    Τι φαίνεται να κάνει το πρόγραμμα και τι κάνει πραγματικά;
    Γιατί;

  • Nikos Kouremenos

    an ke tin C tin barieme (ke kirios ta quiz pu ‘oxinun to mialo’):

    ti giati? giati bazis INT se char ke giati to i pote den ftani pote to 12 opote loopari gia pada

  • Simos

    Βάζω int σε char διότι είναι επιτρεπτό στη C.
    Γίνεται αυτόματη μετατροπή που είναι και έγκυρη για το παράδειγμα.
    Εναλλακτικά μπορείς να θεωρήσεις ότι

    a[i]= (char )i-1;

    Γιατί το i να μην φτάνει ποτέ στο 12; Δεν νομίζω να τού εκχωρώ τιμή;

  • ktop

    Ναί είναι απόλυτα legal.
    Μήπως είναι trick ερώτηση ?

    Πρίν να το τρέξω έλεγα 11.

    Αφού το έτρεξα, ο υπολογιστής είπε 11.
    Ούτε παραπονέθηκε, ούτε τίποτα.
    Ακόμα και με -ansi μια χαρόυλα έκανε “συμπίληση” (aka compile).

    Σε Solaris/Sparc.

    Μήπως είναι κατι που δεν καταλαβαίνω ?

  • Simos

    Ναι, είναι τρικ η ερώτηση.
    Πράγματι σε Solaris/Sparc έχεις διαφορετικό αποτέλεσμα.
    Χρησιμοποίησες τον μεταγλωττιστή της Sun;

    Αν μπορείς να δοκιμάσεις σε GNU/Linux (32bit), θα δεις το παρασκήνιο του τρικ :).

  • Aggelos Orfanakos

    Γιατί είναι ακριβώς legal; Η διάσταση του πίνακα δεν είναι 12; Το μέγιστο array index επομένως είναι 11 (και όχι 12 που παίρνει το i).

  • Simos

    Η μεταγλώττιση δεν παρουσιάζει μήνυμα σφάλματος.

    Μπορείς να εξηγήσεις τη συμπεριφορά του προγράμματος όταν εκτελείται; Έχεις δοκιμάσει να το εκτελέσεις;

  • Άγγελος Ορφανάκος

    Όντως δεν παρουσιάζει. (Δε θα ‘πρεπε;) Εκτυπώνει “a[12] is 11”. Γιατί είναι legal δε μπορώ να μαντέψω (ειδικά εφόσον έχουμε πρόσβαση σε index ίσο με το μήκος του πίνακα a). Βέβαια αυτό είναι το λιγότερο. Το γεγονός ότι εκτυπώνει 11, και όχι “σκουπίδια” ή κάποιον τυχαίο ακέραιο, ενισχύει το “μυστήριο”.

  • Simos

    Πιστεύω ότι η πλατφόρμα που δοκίμασες το πρόγραμμα δεν είναι Linux/i386 (μάλλον AMD64;). Σε πρόσφατο Linux/i386 έχει μια πολύ συγκεκριμένη/παράξενη συμπεριφορά.

    H C είναι μια “untyped” γλώσσα, που σημαίνει μεταξύ άλλων ότι δεν ελέγχει για προσβάσεις εκτός των ορίων ενός πίνακα, κατά την μεταγλώττιση ή εκτέλεση.

  • Άγγελος Ορφανάκος

    Το τελευταίο δεν το γνώριζα.

    Το πρόγραμμα το δοκίμασα σε GCC 3.3.6, Gentoo Linux, Intel Pentium III Coppermine.

  • Simos

    Την συμπεριφορά (στο πρόγραμμα) που ζητάω να διερευνηθεί είναι αυτή που λαμβάνω σε Linux/x86 (2.6.11-1.1369_FC4smp i686) με GCC (4.0.0 20050519 (Red Hat 4.0.0-8)). Με άλλα λόγια, Fedora Core 4 και μάλλον και Ubuntu Breezy.

    Συγκεκριμένα, αυτό που συμβαίνει είναι ότι το πρόγραμμα κολλάει όταν το εκτελείς. Ναι, απλά κολλάει χωρίς να εκτυπώνει κάτι. Γιατί να κολλάει ενώ δεν υπάρχει τέτοια εντολή;

    Παρόμοιο παράδειγμα είναι και το
    http://simos.info/blog/?p=421

Leave a Reply

%d bloggers like this: