为什么输出参数不会在函数之外更改

时间:2020-04-23 12:44:52

标签: c struct

背景

我编写了一个名为removeIllegalMoveFromMovesCell的函数,用于从某些变量中删除数据,现在我们将其称为x和y。 x 的值会在函数内部更改,但不会在函数外部更新。

调用方法:

removeIllegalMoveFromMovesCell(movesArr[row][col].moves,&(movesArr[row][col].size), row, col);

解释变量

上面提到的

x和y变量是movesArr[row][col].movesmovesArr[row][col].size,它们基于这些结构:

typedef struct _move {
    char rows;
    char cols;
} move;

typedef struct _movesArray {
   unsigned int size;
   move* moves;
} movesArray;

这是我创建它们的方式:

movesArray* arr = (movesArray*)malloc(sizeof(movesArray));

move* movesArr1 = (move*)malloc(2 * sizeof(move));
move* movesArr2 = (move*)malloc(2 * sizeof(move));

move move1, move2, move3, move4;

move1.rows = -2;
move1.cols = 3;

move2.rows = 1;
move2.cols = 3;

move3.rows = -2;
move3.cols = 5;

move4.rows = 1;
move4.cols = 2;

movesArr1[0] = move1;
movesArr1[1] = move2;

movesArr2[0] = move3;
movesArr2[1] = move4;

arr[0].size = 2;
arr[1].size = 2;

arr[0].moves = movesArr1;
arr[1].moves = movesArr2;

removeIllegalMoveFromMovesCell方法:

void removeIllegalMoveFromMovesCell(move* moves, int* size, int currRow, int currCol) {
int i;
int cloneIndex = 0;

move* movesClone = (move*)malloc((*size - 1) * sizeof(move));

for (i = 0; i < *size; i++) {
    if (!isMoveOutOfBounds(currRow, currCol,
        getPureNumber(moves[i].rows), getPureNumber(moves[i].cols))) {

        movesClone[cloneIndex].rows = moves[i].rows;
        movesClone[cloneIndex].cols = moves[i].cols;
        cloneIndex++;
    }
}

moves = (move*)realloc(moves, cloneIndex * sizeof(move));

for (i = 0; i < cloneIndex; i++) {
    moves[i] = movesClone[i];
}

*size = cloneIndex;

}

问题和到目前为止我尝试过的事情:

尽管size变量在方法外更改(并且通过更改movesArr[row][col].size),moves变量将接收方法内的所有movesClone变量,并将更改其值在方法内,但不会在方法外(movesArr[row][col].moves)进行更改。

move充当局部变量,尽管我传递了他的引用而不是它的值,但我不明白为什么在方法之外它不会改变


其他信息:

这里是getPureNumber内部使用的removeIllegalMoveFromMovesCell函数

int getPureNumber(char c) {//simple return `movesArr[row][col].size` as number
if (c < 0)
    return c - 0;
return c;
}

0 个答案:

没有答案