Ezzel az a baj ogy a fix_string altal mutatott adatot ("FIX STRING") a linker olyan teruletre helyez(het)i ami csak olvashato. Ezt hivjak .rodata szegmensnek. Ha csinalsz egy `char* szoveg` pointert, ami utana bele mutat ebbe a teruletbe, akkor a fordito azt hiheti hogy ez a terulet modosithato. Azaz a szoveg[0]='a' egy szep combos segfault-hoz vezethet (vagy mikrokontrolleren egy bus error-hoz, extrem esetben meg a periferia-busz is mas, pl egy harvard architekturan ez const char* altal mutatott string mehet a progrmem-be, mig a sima char * a RAM-ba mutat).
Olyannnyira igaz ez hogy eleve a string mint tipus meg sima mezei C-ben is const char * tipusu lesz, meg ha ki sem irod:
apal@laptop:~$ cat x.c
#include <stdio.h>
char * fix_string = "FIX STRING";
int main(void)
{
char * szoveg = fix_string;
szoveg=fix_string;
/* szoveg[0]='a'; */
printf("%s\n",szoveg);
return(0);
}
apal@laptop:~$ gcc -o x x.c
apal@laptop:~$ ./x
FIX STRING
apal@laptop:~$
verzusz:
apal@laptop:~$ cat x.c
#include <stdio.h>
char * fix_string = "FIX STRING";
int main(void)
{
char * szoveg = fix_string;
szoveg=fix_string;
szoveg[0]='a';
printf("%s\n",szoveg);
return(0);
}
apal@laptop:~$ gcc -o x x.c
apal@laptop:~$ ./x
Segmentation fault
apal@laptop:~$
Es akkor itt jonnek szep sorban a warning/error szintek:
- naivan, alapertelmezesben C nyelv eseten a fenti pelda nem ad forditasi warningot/hibat
- ha a const-ot kiirod a fix_string ele, akkor mar a C forditasi warningot ad (azaz szol hogy valami potencialis gaz lehet, es gaz is lesz mert segfault)
- a C++ eseten ez meg mar nemhogy warning hanem error, az megerosebben tipusos