【发布时间】:2021-12-18 17:22:23
【问题描述】:
我正在尝试动态分配一个矩阵 N*N 并将随机数(介于 0 和 h-1 之间)放入其中。我还必须创建一个释放它的函数。问题是我必须使用结构,而且我不太习惯它们。结构“game_t”在另一个文件中定义并包含在内。
game_t * newgame( int n, int m, int t){
game_t x, *p;
int i,j;
p=&x;
x.t=t;
x.n=n; /* structure game has n,t,h,board as keys*/
x.h=h;
srand(time(NULL));
x.board=malloc(n*sizeof(int*)); /*Allocate*/
if (x.board==NULL) return NULL;
for (i=0;i<n;i++){
x.board[i]=malloc(n*sizeof(int));}
for (i=0;i<n;i++){ /*put random numbers*/
for (j=0;i<n;j++){
x.board[i][j]=rand()%h;}}
return p;
}
void destroy(game_t *p){
int i;
for (i=0;i<p->n;i++){
free(p->board[i]);}
free(p->board);
}
【问题讨论】:
-
for (j=0;i<n;j++)看起来不正确 (ij) -
主要问题是
p=&x;这里你让p指向local变量x,这个变量的生命周期在函数newgame时结束返回。这使得指针无效。 -
你在这里返回一个局部变量的地址:
return p;,因为p指向x。 -
x 存在于堆栈中。它在 newgame 之外不存在。
-
除了所有的错误,您可能希望使用二维数组。见Correctly allocating multi-dimensional arrays。
标签: c matrix segmentation-fault free