定数リテラル get が (SO から) プログラムのデータ セグメントに配置され、読み取り専用であるため、" s[0] = 'a' " という行でエラーが発生することがわかりました。その行のコメントを外して実行しました。しかし、MS VS のメモリ ウィンドウを調べたところ、変数はすべてメモリ内にまとめて配置されています。彼ら(コンパイラ)が「s」への読み取り専用アクセスをどのように強制するかについて興味がありますか?
#include <iostream>
int main(void)
{
char *s = "1023";
char s_arr[] = "4237";
char *d = "5067";
char s_arr_1[] = "9999";
char *e = "6789";
printf("%c\n", s[0]);
// s[0] = 'a'; This line would error out since s should point to data segment of the program
printf("%s\n", s);
system ("pause");
}
0x002E54F4 31 30 32 33 00 00 00 00 34 32 33 37 00 00 00 00 1023....4237....
0x002E5504 35 30 36 37 00 00 00 00 39 39 39 39 00 00 00 00 5067....9999....
0x002E5514 36 37 38 39 00 00 00 00 25 63 0a 00 25 73 0a 00 6789....%c..%s..
0x002E5524 70 61 75 73 65 00 00 00 00 00 00 00 43 00 3a 00 pause.......C.:.
編集 1: s_arr (スタック領域に配置する必要があります) に格納されている値を更新して、文字列定数に隣接して配置されていることを明確にします。
編集 2: ページに基づく ro/rw アクセスに関する回答を見ているので、ここではアドレス .. 0x...4f4 は rw 0x...4fc はroで、0x...504 は rw です。彼らはどのようにしてこの粒度を達成するのでしょうか? また、各ページは最小 4kb である可能性があるため、0x4fb は前の ro ページの最後のアドレスである可能性があると主張できます。しかし、いくつかの変数を追加して、それらがすべてメモリ内に連続して配置され、粒度が 8 バイトごとであることを示しました。あなたが言ったように、ページは4kレベルなので、