( apal | 2023. 01. 02., h – 12:52 )

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