Δημοσιεύτηκε: 08 Απρ 2012, 14:26
από Ilias95
Μόλις ξεκίνησα να διαβάζω το κεφάλαιο 17 για την δυναμική διαχείριση μνήμης.
Μια απορία που προκύπτει μέχρι στιγμής είναι η παρακάτω.

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void)
{
char *p = "Ena string.";

p[1] = 'o';
puts(p);

return 0;
}

Το παραπάνω παράδειγμα δίνει segmentation fault και είχαμε εξηγήσει στο παρελθόν ότι αυτό συμβαίνει λόγο του ότι ο pointer p δείχνει σε read-only περιοχή μνήμης.

Όμως το παρακάτω παράδειγμα:
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// concatenates two strings
char *concat (const char *s1, const char *s2)
{
char *result;

result = malloc(strlen(s1) + strlen(s2) + 1);
if (result == NULL) {
printf("Error: malloc failed in concat\n");
exit(EXIT_FAILURE);
}
strcpy(result, s1);
strcat(result, s2);
return result;
}

int main(void)
{
char *p;

p = concat("Ena st", "ring.");
p[1] = 'o';
puts(p);

return 0;
}

δουλεύει κανονικά...

Τι συμβαίνει στην προκειμένη; Ο p αρχικά δείχνει σε read-only περιοχή και μετά σε μη read-only;