[英]write access violation using 2d array
我正在尝试将字符放入2D数组中。 我已经定义了这些对象:
typedef struct board {
char* board[25][80];
}Board;
typedef struct obstacleA {
int* x;
int* y;
}ObstacleA;
typedef struct obstacleC {
int* x;
int* y;
}ObstacleC;
typedef struct obstacleB {
int* x;
int* y;
}ObstacleB;
typedef struct Star {
int *x;
int *y;
int *power;
}Star;
typedef struct Cross {
int *x;
int *y;
int *power;
}Cross;
我的spawn函数为我的对象提供随机数(或坐标)
void spawn(Board* board, Cross* cross, Star* star, ObstacleA* A, ObstacleB* B, ObstacleC* C) {
srand(time(NULL));
cross->x = (1 + rand() % 24);
cross->y = (1 + rand() % 79);
star->x = (1 + rand() % 24);
star->y = (1 + rand() % 79);
A->x = (1 + rand() % 24);
A->y = (1 + rand() % 79);
B->x = (1+ rand() % 24);
B->y = (1+ rand() % 79);
C->x = (1 + rand() % 24);
C->y = (1 + rand() % 79);
putBoard(&board, &cross, &star, &A, &B, &C);
}
putBoard函数将字符放置在适当的坐标中:
void putBoard(Board* board, Cross* cross, Star* star, ObstacleA* A, ObstacleB* B, ObstacleC* C) {
board->board[*star->x][*star->y] = '*';
board->board[*cross->x][*cross->y] = '+';
board->board[*A->x][*A->y] = 'A';
board->board[*B->x][*B->y] = 'B';
board->board[*C->x][*C->y] = 'C';
}
但是,运行该程序时,出现“抛出异常:写访问冲突。板为0x21C3BD2”。 在“ board->board[*C->x][*C->y] = 'C';
”行。
当您调用putBoard
您将指针指向该板的指针 。 也就是说,您传递了Board **
类型的东西。 与传递给putBoard
的其他参数putBoard
,您将指针传递给指针。
从spawn
调用putBoard
时,请勿使用地址运算符&
。
一个好的编译器应该警告您有关传递不兼容的指针类型。
就像评论所说的那样,您已经完全超出了指针。 在大多数使用指针的地方,您可能根本不需要它。
您正在为地址分配随机值,这不是您想要的:
cross->x = (1 + rand() % 24);
cross->y = (1 + rand() % 79);
star->x = (1 + rand() % 24);
star->y = (1 + rand() % 79);
A->x = (1 + rand() % 24);
A->y = (1 + rand() % 79);
B->x = (1+ rand() % 24);
B->y = (1+ rand() % 79);
C->x = (1 + rand() % 24);
C->y = (1 + rand() % 79);
由于在x
, y
指针中有一个随机值,因此在程序崩溃的那一行有两个问题:
board->board[*C->x][*C->y] = 'C';".
1)取消引用随机地址通常会使程序崩溃。
2)即使您的程序在该操作后仍然存在,仍取消引用的值
*C->x, *C->y
可以很容易地超出board
阵列的边界。 那也会使您的程序崩溃。
您肯定在结构中过度使用了指针。 您不需要它们。 您只需注意将指针传递给您的结构,以便可以修改内部成员。
3)程序应尽可能简单,指针的过度使用将使其更难理解且容易出错。
putBoard(&board, &cross, &star, &A, &B, &C);
应该:
putBoard(board, cross, star, A, B, C);
如前所述,编译器应该警告您有关传递不兼容的指针类型。
您的程序可以根据您的结构进行固定,但越简单越好。 看一眼:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROWS 6
#define COLUMNS 50
typedef struct board {
char board[ROWS][COLUMNS];
}Board;
typedef struct obstacleA {
int x;
int y;
}ObstacleA;
typedef struct obstacleC {
int x;
int y;
}ObstacleC;
typedef struct obstacleB {
int x;
int y;
}ObstacleB;
typedef struct Star {
int x;
int y;
int power;
}Star;
typedef struct Cross {
int x;
int y;
int power;
}Cross;
void putBoard(Board* board, Cross* cross, Star* star, ObstacleA* A, ObstacleB* B, ObstacleC* C) {
board->board[star->x][star->y] = '*';
board->board[cross->x][cross->y] = '+';
board->board[A->x][A->y] = 'A';
board->board[B->x][B->y] = 'B';
board->board[C->x][C->y] = 'C';
}
void spawn(Board* board, Cross* cross, Star* star, ObstacleA* A, ObstacleB* B, ObstacleC* C) {
srand(time(NULL));
cross->x = (1 + rand() % (ROWS-1));
cross->y = (1 + rand() % (COLUMNS-1));
star->x = (1 + rand() % (ROWS-1));
star->y = (1 + rand() % (COLUMNS-1));
A->x = (1 + rand() % (ROWS-1));
A->y = (1 + rand() % (COLUMNS-1));
B->x = (1+ rand() % (ROWS-1));
B->y = (1+ rand() % (COLUMNS-1));
C->x = (1 + rand() % (ROWS-1));
C->y = (1 + rand() % (COLUMNS-1));
putBoard(board, cross, star, A, B, C);
}
void printBoard(Board* board)
{
for(int i= 0; i< ROWS; i++){
for(int j= 0; j< COLUMNS; j++) {
printf("%c", board->board[i][j]);
}
printf("\n");
}
}
void cleanBoard(Board* board)
{
for(int i= 0; i< ROWS; i++){
for(int j= 0; j< COLUMNS; j++) {
board->board[i][j] = ' ';
}
}
}
int main(void)
{
Board board;
ObstacleA A;
ObstacleC C;
ObstacleB B;
Star S;
Cross CR;
cleanBoard(&board);
spawn(&board, &CR, &S, &A, &B, &C);
putBoard(&board, &CR, &S, &A, &B, &C);
printBoard(&board);
return 0;
}
输出:
C
*
A
+
B
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.