Δημοσιεύτηκε: 21 Μαρ 2012, 22:58
από migf1
Είναι και πάλι τι ίδιο πρόβλημα με προηγουμένως. Το "string" που περνάς απευθείας στην func() στην 1η περίπτωση, είναι read-only (string literal)... οπότε με το που πάει η συνάρτηση capitalize() να μετατρέψει σε κεφαλαίο τον πρώτο πεζό χαρακτήρα του, σκάει seg-fault

Αντίθετα, στη 2η περίπτωση, περνάς στην func() ένα mutable (read/write) string, μιας και πρόκειται για μεταβλητή που την έχεις δηλώσει ως πίνακα από χαρακτήρες.

Το πιο κοντινό παράδειγμα που μπορώ να σκεφτώ για το σφάλμα που κάνεις στην 1η περίπτωση, είναι κάτι σαν το παρακάτω.

Μορφοποιημένος Κώδικας: Επιλογή όλων
int plus10( int *n )
{
return *n + 10;
}

int main( void )
{
printf( "%d\n", plus10( &2 ) ); // ΣΦΑΛΜΑ... το 2 είναι απλώς μια σταθερά, δεν έχει διαχειρίσιμη διεύθυνση
}


Ενώ στη 2η περίπτωση το κάνεις σωστά...

Μορφοποιημένος Κώδικας: Επιλογή όλων
int main( void )
{
int n;

n = 2;
printf( "%d\n", plus10( &n ) ); // Σωστό!
...
}


Η ορολογία "string literal" είναι αντίστοιχη της ορολογίας "σταθερά" για τους υπόλοιπους τύπους... δηλαδή είναι η τιμή ενός string (και όχι η μεταβλητή) , η οποία τιμή προφανώς δεν μπορεί να διαχειριστεί όπως διαχειρίζονται οι μεταβήτές.