-4

これは私のコードです。ランタイムチェックの失敗#2-変数「tempSign」の周りのスタックが破損している理由がわかりません。エラーは、char *tempSign[MAX]の2つの値を交換しようとしたときに発生すると思います。誰かが私がこのエラーを受け取っている理由を説明し、この問題を解決するのを手伝ってくれますか?

void constructSet(ZodiacSign *& z,int size)
{

    /*ZodiacSign is a char *
     This is how z was created from the previous function and 
     passed by reference

     ZodiacSign * z;
     z=new char* [num];

    for (int i=0;i<num;i++)
    {
        z[i]=new char [MAXSTR]; 
    } */

    ZodiacSign tempSign [MAX]={"aquarius","pisces","aries","taurus","gemini","cancer","leo",
                               "vergo","libra","scorpio","sagittarius","capricorn"};


    for (int i=0; i<size;i++)
    {
        int x=12;
        int num=(rand()%x);

        char * ptr=tempSign[num];
        strcpy(z[i],ptr);
        swap(num,x,tempSign);

        x--;
    }
}

void swap(int num,int x,ZodiacSign tempSign [MAX])
{
    ZodiacSign temp;

    temp=tempSign[num];

    tempSign[num]=tempSign[x-1];

    tempSign[x]=temp;
}
4

1 に答える 1

6

constructSetセット内のループの最初の繰り返しはx12. swapに書き込もうとしtempSign[12]ます。C 配列はゼロベースなので、有効なインデックスtempSignは [0..11] です。要素 12 への書き込みは未定義の動作ですが、tempSign.

次の行を変更することでこれを修正できますswap

tempSign[x-1]=temp;
//        ^^
于 2013-01-30T15:13:56.417 に答える