[英]C - Pointer to dynamic array in struct “Segmentation fault (core dumped)”
[英]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.