const参数在数组定义后更改

时间:2012-11-28 15:34:35

标签: c const

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

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

作为这个函数的第一件事,我定义了一个2d的short数组,我用它作为布尔值。但是当我调用此函数时,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。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

很可能...中的代码访问超出used的末尾,导致参数被粉碎。没有代码,当然不可能说。

答案 1 :(得分:1)

由于您似乎没有初始化数组used,因此可能会考虑使用某些元素(!= 0),因为堆栈上的数组未初始化为零,但需要采取任何操作以前在那个记忆区。 如果使用X,Y对,则将循环计数器递减,可能超过零进入负区域,可能覆盖 - 在下一次迭代 - 堆栈的一部分。这也可能会更改参数,因为它们也位于本地阵列之前的同一堆栈中。

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