0

我有一个我认为非常奇怪的问题。我有一个具有以下原型的函数:

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

作为该函数中的第一件事,我定义了一个 2d 短裤数组,我将其用作布尔值。但是当我调用这个函数时,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,因此很可能认为某些元素已被使用(!= 0),因为堆栈上的数组未初始化为零,而是采用之前在该内存区域中的任何内容。如果认为使用了 X,Y 对,则将循环计数器递减,可能超过零进入负范围,可能会覆盖 - 在下一次迭代中 - 堆栈的一部分。这也可能会更改参数,因为它们也位于本地数组之前的同一堆栈中。

从初始化开始used,并考虑重写循环以不更改循环变量,除非在for语句中。

于 2012-11-28T15:59:58.703 回答