1

我试图让一个函数获取一些从我的 main() 函数传递的整数指针并为它们赋值。但是,我的程序在分配值时崩溃。这是我的代码:

int computeMoveLocation(int* r, int* c, char* board)
{
    //some code up here
    *r = 0;    //This breaks the program
    *c = 0;
}

我不是要更改指针的地址——我是要更改所指向的整数的。但是,我显然做错了什么。

任何帮助将不胜感激。

编辑: 这是来自 main() 的相关代码。请让我知道我是否还应该包括其他任何内容。

int main()
{
    //initialization code
    //...

    while (1)
    {

        switch (MACHINE_STATE)
        {
            case COMPUTER_MOVE :
            {
               //check rows for three Xs
               //check columns for three Xs
               //check diagonals for three Xs
               //otherwise, move anywhere else
               int *r, *c;
               computeMoveLocation(r, c, board);
               computerMove(*r,*c, board);
               PREVIOUS_STATE = COMPUTER_MOVE;
               MACHINE_STATE = HUMAN_MOVE;
               break;
            }

            //Other cases
        }//end switch
    }//end while
}//end main
4

3 回答 3

10

您正在传递指针,但您没有分配内存。所以他们指向内存中的一个随机位置。

int computeMoveLocation(int* r, int* c, char* board) {
    //some code up here
    *r = 0;    //This breaks the program
    *c = 0;
}

坏主要:

int main() {
    int *r;
    int *c;
    char *board;
    // bad, passing in pointers but didn't allocate memory
    computeMoveLocation(r, c, board); 
    return 0;
}

好的主要#1:

int main() {
    int r = 5;
    int c = 5;
    char board = 'a';
    // fine, passing address of variables on stack
    computeMoveLocation(&r, &c, &board); 
    return 0;
}

好的主要#2:

int main() {
    int *r = malloc(sizeof(int));
    *r = 5;
    int *c = malloc(sizeof(int));
    *c = 5;
    char *board = malloc(sizeof(char));
    *board = 'a';
    // fine, passing pointers that point to heap
    computeMoveLocation(r, c, board); 

    free(r);
    free(c)
    free(board);
    return 0;
}
于 2013-03-03T04:12:10.510 回答
1

您始终可以传递一个指针并修改指针指向的值。这就是应该使用指针的方式。但是,您还应该小心查看指针是否确实指向某物。指针应包含一个有效地址,即您可以更改其位置的值。如果您不确保这一点,则会导致未定义的行为。

例如,当您调用 computeMoveLocation 函数时,您传递的地址应该是堆栈或堆地址。你可以看下面的代码来理解它。

第一种可能性

int r, c;
char board;
computeMoveLocation(&r,&c, &board);

第二种可能性

int *r, *c;
char *board;

r = malloc(sizeof(int));
c = malloc(sizeof(int));
board = malloc(sizeof(char));
computeMoveLocation(r,c,board);

请注意,char *它通常也用于将地址传递给字符数组,但是,在这种用法中,通常要确保它是空终止的,或者也传递了数组的伴随长度。

无论如何,您都可以通过简单的谷歌搜索获得更多关于传递指针的详细信息。


编辑 现在,您已经发布了调用 computeMoveLocation 的代码,您看到您应该根据上面显示的第二种可能性修改您的代码,因为您将 r 和 c 声明为指针,或者您应该将它们声明为整数并按照第一种可能性如上所示。但是,你没有做同样的事情导致未定义的行为。

另外,在上面的例子中,我已经为板子分配了内存,但是,在你的情况下,如果它来自其他地方并且在那里得到了适当的处理,那么它不需要被分配。

于 2013-03-03T04:14:21.553 回答
1
int *r, *c;
computeMoveLocation(r, c, board);
computerMove(*r,*c, board);

你定义了一个指针,但不要让它指向任何东西。因此,它是一个指针或未初始化的指针;*r像您一样访问computeMoveLocation会导致未定义的行为(在您的情况下是崩溃)。

您必须初始化指针以指向已知的东西,或者只传递现有的地址int

int r, c;
computeMoveLocation(&r, &c, ...);

或者

static int x, y; // static: only one instance of the variable exists
int *r = &x; // initialize pointers
int *c = &y;
computeMoveLocation(r, c, ...);

或者

int *r = malloc(sizeof(int));
int *c = malloc(sizeof(int));
computeMoveLocation(r, c, ...);

在最后一种情况下,请确保free事后记忆。

于 2013-03-03T04:15:22.893 回答