私は少しの C コードを C++ としてコンパイルしていて、私を困惑させるものに遭遇しました。LuaFileSystem から取得した次の関数を検討してください。
static const char *perm2string (unsigned short mode) {
static char perms[10] = "---------";
//static char* perms = "---------";
int i;
for (i=0;i<9;i++) perms[i]='-';
if (mode & _S_IREAD)
{ perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; }
if (mode & _S_IWRITE)
{ perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; }
if (mode & _S_IEXEC)
{ perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; }
return perms;
}
このコードは正しく動作しますが、コメント行のコメントを外すとクラッシュします。デバッガーでこれをステップオーバーしましたがstatic char* perms
、文字列が読み取り専用メモリに配置されているように見えるため、最初のループでアクセス違反が発生しますが、静的配列を使用してもそのような問題は発生しません。文字列が const として宣言されていないときに、なぜこれが起こっているのか知りたいです。