繁体   English   中英

带有数组 c 的分段错误(核心转储)结构

[英]Segmentation fault (core dumped) struct with an array c

我有一个带有数组的结构,它应该告诉敌人往哪里走。 问题是我遇到了分段错误,我不知道为什么。

结构

struct Enemy {
    
    bool scared;
    bool runhome;    
    int posx; 
    int posy;
    int home[][2]; //{x,y}

};

减速

struct Enemy pinky = {false, false, 1,1, {{1,1},{1,2},{1,3},{2,3},{3,3},{4,3},{4,2},{4,1},{3,1},{2,1}}};
struct Enemy clyde = {false, false, 1,19, {{1,19},{2,19},{3,19},{4,19},{5,19},{6,19},{7,19},{8,19},{8,18},{8,17},{8,16},{8,15},{7,15},{6,15},{6,16},{6,17},{5,17},{4,17},{3,17},{2,17},{1,17},{1,18}}};
struct Enemy blinky = {false, false, 17,1, {{17,1},{17,2},{17,3},{16,3},{15,3},{14,3},{14,2},{14,1},{15,1},{16,1}}};
struct Enemy inky = {false, false,  17,19, {{17,19},{16,19},{15,19},{14,19},{13,19},{12,19},{11,19},{10,19},{10,18},{10,17},{10,16},{10,15},{11,15},{12,15},{12,16},{12,17},{13,17},{14,17},{15,17},{16,17},{17,17},{17,18}}};

我称之为家的地方

else if(ghost->runhome) {
    int *targetposition;
    //decides which way to move
    targetposition = optimalpath(ghost->posx, ghost->posy, ghost->home[0][0],  ghost->home[0][1]);
}

在我添加主阵列之前,我没有收到任何错误,但是一旦添加,我就收到了分段错误错误。

您声明了一个具有灵活数组成员的结构

struct Enemy {
    
    bool scared;
    bool runhome;    
    int posx; 
    int posy;
    int home[][2]; //{x,y}

};

尚未分配用于灵活阵列的 memory。 所以你可能不会使用数组。 您需要为灵活数组成员动态分配 memory 以及结构类型的 object。

例如

struct Enemy *pinky = malloc( sizeof( struct Enemy ) + sizeof( int[10][2] ) );

您还需要跟踪灵活数组成员有多少元素。

如果你真的需要/想要编译时初始化......

在这里,您初始化 4 个独立的 arrays 的“运动”(为简洁起见,我已截断。)

int pinkyHome[][2] = { {1,1},{1,2},{1,3},{2,3}, };
int clydeHome[][2] = { {1,19},{2,19},{3,19},{4,19},{5,19}, };
int blinkyHome[][2] = { {17,1},{17,2},{17,3},{16,3},{15,3}, };
int inkyHome[][2]   = { {17,19},{16,19}, };

然后定义一个宏来节省大量多余的输入;

#define MAC( who ) #who, sizeof who##Home / sizeof who##Home[ 0 ], who##Home

然后,您可以将每个(可变长度)“移动”数组添加到结构中(作为指针),(包括每个移动的数量)。

因为我们可以,我已经调整了你的结构(包括 typedef)来存储角色的名字、移动的数量(在这种情况下是“截断”)和移动的完整列表......

typedef struct {
    bool scared;
    bool runhome;
    int posx;
    int posy;
    char *name; // New to squeeze into macro
    int nsteps;
    int (*home)[2];
} Enemy_t;

现在我们可以声明这四个字符,编译时初始化...

Enemy_t pinky   = { false, false,  1,  1, MAC( pinky ) };
Enemy_t clyde   = { false, false,  1, 19, MAC( clyde ) };
Enemy_t blinky  = { false, false, 17,  1, MAC( blinky ) };
Enemy_t inky    = { false, false, 17, 19, MAC( inky ) };

展示它是如何工作的:

void show( Enemy_t *p ) {
    printf( "%s:\n", p->name );
    for( int i = 0; i < p->nsteps; i++ )
        printf( "p->home[%d][0] %d  p->home[%d][1] %d\n", i, p->home[i][0], i, p->home[i][1] );
    printf( "\n" );
}

int main() {
    show( &pinky );
    show( &clyde );
    show( &blinky );
    show( &inky );

    return 0;
}

最后,function的证明……

pinky:
p->home[0][0] 1  p->home[0][1] 1
p->home[1][0] 1  p->home[1][1] 2
p->home[2][0] 1  p->home[2][1] 3
p->home[3][0] 2  p->home[3][1] 3

clyde:
p->home[0][0] 1  p->home[0][1] 19
p->home[1][0] 2  p->home[1][1] 19
p->home[2][0] 3  p->home[2][1] 19
p->home[3][0] 4  p->home[3][1] 19
p->home[4][0] 5  p->home[4][1] 19

blinky:
p->home[0][0] 17  p->home[0][1] 1
p->home[1][0] 17  p->home[1][1] 2
p->home[2][0] 17  p->home[2][1] 3
p->home[3][0] 16  p->home[3][1] 3
p->home[4][0] 15  p->home[4][1] 3

inky:
p->home[0][0] 17  p->home[0][1] 19
p->home[1][0] 16  p->home[1][1] 19

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM