为int指针赋值时,为什么我的C程序崩溃了?

时间:2013-03-03 03:58:53

标签: c pointers pass-by-reference

我试图让一个函数从我的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

3 个答案:

答案 0 :(得分:9)

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

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

Bad main:

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;
}

答案 1 :(得分: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声明为指针,或者您应该将它们声明为整数并按照第一个调用可能性如上所示。但是,你没有做同样导致未定义行为的事情。

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

答案 2 :(得分:1)

int *r, *c;
computeMoveLocation(r, c, board);
computerMove(*r,*c, board);

您定义指针但不指向任何指针。因此,它是 wild 未初始化的指针;像在*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内存。