【问题标题】:write access violation using 2d array使用二维数组写访问冲突
【发布时间】:2023-03-27 11:41:01
【问题描述】:

我正在尝试将字符放入我的二维数组。我已经定义了这些对象:

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';”行。

【问题讨论】:

  • 你真的想要一个由char 指针组成的二维数组吗?
  • 分配内存以便那些char* 指向一些内存并且你写给他们。 &board 不能有 Board* 类型,如果 board 本身是 Board* - 它将是 Board**
  • @coderredoc 或仅分配给 string 文字
  • 结构中的整数也一样。我认为你的结构中根本不需要指针。
  • 如果你只使用例如的第一个元素star->x,那为什么要用指针开头呢?为什么Star结构的x成员是指针?

标签: c arrays struct char


【解决方案1】:

当您调用putBoard 时,您将指针传递给指针 到板。也就是说,你传递了Board ** 类型的东西。与您传递给putBoard 的其他参数相同,您将指针传递给指针。

spawn 调用putBoard 时不要使用地址运算符&

一个好的编译器应该警告你传递不兼容的指针类型。

正如 cmets 所说,你的指针太过分了。在您使用指针的大多数地方,您可能根本不需要它。

【讨论】:

  • 是的,我不应该使用那么多指针。该程序现在运行良好,谢谢@
【解决方案2】:

您正在为地址分配随机值,这不是您想要的:

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

由于您在xy 指针中有一个随机值,因此您在程序崩溃的行中有两个问题:

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  

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多