1

私は少しの 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 として宣言されていないときに、なぜこれが起こっているのか知りたいです。

4

6 に答える 6