我试图让一个函数从我的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
答案 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
内存。