Sep 02 2005

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

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

#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;

Permanent link to this article: https://blog.simos.info/%cf%84%ce%b9-%ce%b8%ce%b1-%ce%b5%ce%ba%cf%84%cf%85%cf%80%cf%8e%cf%83%ce%b5%ce%b9/

19 comments

Skip to comment form

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

  2. Για κάποιο λόγο “κόπηκε” το σχόλιο στο string ” ”

  3. Δεν εξηγείται αλλιώς, το wordpress κόβει τα σχόλια που έχουν δίπλα δίπλα τους χαρακτήρες

  4. ΟΚ λάθος μου, ξέχασα ότι πρέπει να 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

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

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

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

  6. 🙂

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

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

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

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

  8. den tiponi tipota se debian me gcc 4.0.2

    sorry re simo alla ti ypotithete oti prepi na tiposi?

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

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

  10. 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

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

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

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

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

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

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

    Σε Solaris/Sparc.

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

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

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

    • Aggelos Orfanakos on October 2, 2005 at 08:21
    • Reply

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

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

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

    • Άγγελος Ορφανάκος on October 2, 2005 at 16:50
    • Reply

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

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

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

    • Άγγελος Ορφανάκος on October 2, 2005 at 20:18
    • Reply

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

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

  16. Την συμπεριφορά (στο πρόγραμμα) που ζητάω να διερευνηθεί είναι αυτή που λαμβάνω σε 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: