0

私は本当に奇妙な問題だと思うものを持っています。次のプロトタイプを持つ関数があります。

void generateNodes(const int maxX, const int maxY, node nodes[]);

この関数の最初の 1 つとして、ブール値として使用する short の 2 次元配列を定義します。しかし、この関数を呼び出すと、maxY の値が大きな値に変わります。問題のコードは以下のとおりです。

void generateNodes(const int maxX, const int maxY, node nodes[]){
    int i, currentX, currentY;

    short used[MAX_NODES][MAX_NODES];

    //Generate the nodes
    for(i = 0; i < MAX_NODES; i++){
        currentX = randomNumber(0,maxX);
        currentY = randomNumber(0,maxY);

        nodes[i].color = 0;
        nodes[i].numberOfConnections = 0;
        nodes[i].id = i;
        nodes[i].distanceFromStart = NOT_SET;
        nodes[i].parent = NULL;

        if(!used[currentX][currentY]){
            nodes[i].x = currentX;
            nodes[i].y = currentY;

            used[currentX][currentY] = 1;
        } else {
            i--;
        }
    }

    int numberOfConnections, j, currentNeighbor;

    //Generate the connections
    for(i = 0; i < MAX_NODES; i++){
        numberOfConnections = randomNumber(1,5); //Between one and five outgoing connections

        for(j = 0; j < numberOfConnections; j++){

            currentNeighbor = randomNumber(0,19); //Select the neighbor

            while(currentNeighbor == i){
                currentNeighbor = randomNumber(0,19); //Try again while the selected is self
            }

            nodes[i].canReach[++(nodes[i].numberOfConnections)] = &nodes[currentNeighbor];

            nodes[currentNeighbor].canReach[++(nodes[currentNeighbor].numberOfConnections)] = &nodes[i];
        }
    } 
}

MAX_NODES は 20 に定義されています。

なぜこれが起こるのか誰にも分かりますか?

4

2 に答える 2

2

...のコードが の末尾を超えてアクセスしている可能性が非常に高く、used引数が破壊されています。コードがなければ、言うことはもちろん不可能です。

于 2012-11-28T15:40:08.643 に答える
1

配列を初期化していないように見えるため、スタック上の配列はゼロに初期化されていないため、used一部の要素が使用されていると見なされる可能性がありますが、以前にそのメモリ領域にあったものは何でも取得します。!= 0X、Y ペアが使用されていると見なされる場合、ループ カウンターをデクリメントし、おそらくゼロを超えて負の領域に入り、次の反復でスタックの一部を上書きする可能性があります。パラメータもローカル配列の前に同じスタックに存在するため、これによりパラメータが変更される場合があります。

を初期化することから始めて、ステートメントused以外でループ変数を変更しないようにループを書き直すことを検討してください。for

于 2012-11-28T15:59:58.703 に答える