繁体   English   中英

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

[英]Why does my C program crash when assigning a value to an int pointer?

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

您正在传递指针,但未分配内存。 因此,它们指向内存中的随机位置。

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

您始终可以传递指针并修改该指针指向的值。 那就是应该使用指针的方式。 但是,您还应该注意指针是否确实指向某物。 指针应包含一个有效地址,该值可以更改。 如果不确定,则会导致未定义行为。

例如,当您调用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 *通常也用于将地址传递给char *数组,但是在这种用法中,通常要确保它以null终止,或者也要传递数组的伴随长度。

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


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

另外,在上面的示例中,我已经为板分配了内存,但是,在您的情况下,如果它起源于其他地方,并且已经在此处进行了适当的处理,则无需对其进行malloc。

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

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

您必须初始化指针以指向已知的东西,或者仅传递现有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内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM