[英]Why does my C program crash when I try to realloc() a pointer array of structs?
[英]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.