1

読んでくれてありがとう、私の質問は、これが適切にコーディングされているかどうかです:

test1.cpp:

void Load(OBJECTSTRUCT* gObj)
{
    char * VipType = VipTypeCheck(gObj->m_Index);
    MsgOutput(gObj->m_Index,"[%s] Welcome",VipType);
}

test2.cpp:

char* VipTypeCheck(int aIndex)
{
    switch (VipSystem[aIndex].VIP_Type)
    {
    case 0:
        return "Regular";
        break;
    case 1:
        return "Bronze";
        break;
    case 2:
        return "Gold";
        break;
    case 3:
        return "Diamond";
        break;
    default:
        return "[Error]";
        break;
    }
    return "[Error]";
}

それは機能しますが、私の質問は、セグメンテーション違反/スタックオーバーフローまたはその他の種類のエラーにつながる可能性があるということです? 動的メモリを割り当てていないことはわかっていますが、変数 char *VipType が問題ないかどうかは疑問です。ありがとう、初心者の質問でごめんなさい。

4

2 に答える 2

3

あなたは良いです-プログラムの存続期間中に割り当てられる const 静的文字列へのポインターを返しています。

const char *技術的には文字列は変更できないため、戻り値の型を as に変更することをお勧めします。

ポインターは、プログラムの存続期間にわたって存在することが保証されている領域にコンパイラーが配置するため、プログラムの存続期間に適しています。

それらが変更不可能な理由は、コンパイラが巧妙になり、2 つの場所で戻り[Error]、同じであることに気づき、両方に同じポインターを使用することに気付く可能性があるためです。したがって、1 つの func がそれを同じで、もう一方はそうではありません

于 2012-09-04T00:38:40.287 に答える
1
  • VipTypeCheckのプロトタイプを追加する必要がありますtest1.cpp
  • VipTypeCheck関数はconst char *代わりに返す必要がありますchar *
  • 変数VipTypeの型もconst char *

それ以外は問題ありません。文字ポインタを文字列リテラルに返すことは問題ありません。これは、それらを返す関数に対してローカルではないためです。

次のように、配列を使用して関数を単純化することも検討してください。

const char *VipTypes[] = {
    "Regular", "Bronze", "Gold", "Diamond"
};
const char * VipTypeCheck(unsigned int i) {
    return i < 4 ? VipTypes[i] : "[Error]";
}
于 2012-09-04T00:42:18.663 に答える