我正在編寫一些C代碼作爲C++,並遇到了令我困惑的東西。考慮從LuaFileSystem採取的以下功能。static char * vs static char []內存訪問
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時發生的。
'「---------」'是一個_string literal_。它是一個10 ** const ** chars_(9' - '加上「null終止符」)的_static數組,它是_immutable_。你可以用'const char * p =「---------」;'獲得一個指向它的第一個字符的指針,但是如果你想修改它,你必須將它拷貝到一個單獨的數組中('perms'例)。 –
>此代碼將正常工作... 直到您同時使用它。當多個線程試圖訪問這個靜態字符串/數組時,你會得到奇怪的行爲。由於你的代碼只有8種不同的條件,所以你可以很好地使用開關/外殼查找,併爲每個返回一個預定義的字符串文字:'switch(mode){case 0:return「---------」; case _S_IREAD:return「r - r - r--」;/* etc ... * /}'這樣的函數是隻讀的,線程安全的,並且可能比char數組更快地擺脫現在的操作。 –