无法将2维数组分配给C语言结构体

3

我正在编写一款贪吃蛇游戏。我有一个包含蛇的数据结构,例如蛇的位置和长度等。这是snake.h文件:

#ifndef SNAKE_HEAEDER
#define SNAKE_HEAEDER 

#include "direction.h"
#include <string.h>

struct Snake {

        int length;
        int* pos[2];
        int first_pos[2];
        int last_pos[2];
        int direction;

};

void set_snake(struct Snake *snake, int length_, int pos_[][2], int direction_){

        snake->length    = length_              ;
        memcpy(snake->pos, pos_, length_)       ;
        printf("hello\n");
        memcpy(snake->first_pos, pos_[length_-1],1)  ;
        memcpy(snake->last_pos, pos_[0],1)      ;
        snake->direction = direction_           ;
}

并且在 main.c 文件中:

#include <stdio.h>
#include "snake.h"


int main(){

        struct Snake *snake;
        int pos[2][2] = {{1,2}};
        set_snake(snake,1,pos,UP);
        return 0;
}

direction.h 中:


#ifndef DIRECTIONS_HEADER
#define DIRECTIONS_HEADER

#define UP    0 
#define DOWN  1
#define RIGHT 2
#define LEFT  3

#define CURRENT_DIRECTION(x) (x.direction)

#endif


问题在于它不能在 set_snake 中执行 memcpyhello 将永远不会被显示。我得到了分段错误。我需要的是一个二维数组,其中包含蛇所在像素的地址,长度为蛇占用的像素数。希望如果缺少细节,请让我知道。

为什么不这样分配内存:struct Snake *snake = malloc(sizeof *snake); - Andy Sukowski-Bang
2
或者不要将其作为指针:struct Snake snake; - 001
@AndySukowski-Bang 那有什么好处? - Amir reza Riahi
memcpy() 调用中,您没有考虑每个元素的大小。一个 int 大于 1 个字节。 - Weather Vane
不要在头文件中放置函数定义。头文件应该只包含声明。 - William Pursell
1个回答

0

正如Weather Vane在评论中指出的那样,您没有考虑每个元素的大小。

这个函数应该正确地分配内存:

#include <stdlib.h>

struct Snake *set_snake(int length_, int pos_[][2], int direction_)
{
    struct Snake *snake = malloc(sizeof *snake + sizeof(int[length_][2]));

    snake->length = length_;
    memcpy(snake->pos, pos_, sizeof(int[length_][2]));
    memcpy(snake->first_pos, pos_[length_-1], sizeof(int[2]));
    memcpy(snake->last_pos, pos_[0], sizeof(int[2]));
    snake->direction = direction_;

    return snake;
} 

这样调用函数:

struct Snake *snake;
snake = set_snake(1, pos, UP);

顺便说一下,当我用C语言写贪吃蛇游戏时,我将每个元素的x和y坐标存储在一个链表中,这样非常容易操作。如果你感兴趣,可以看一下我的实现

这个函数没有返回任何东西,可以吗? - Amir reza Riahi
@AmirrezaRiahi 你说得对,返回“snake”很重要。我已经相应地更新了我的答案。 - Andy Sukowski-Bang
我认为你正在将 length_ 赋值给 snake->pos,这是行不通的。 - Amir reza Riahi
@AmirrezaRiahi 这是因为我错误地复制了你的代码。我现在已经更新了我的答案。如果可以的话,请将此答案标记为已接受。 - Andy Sukowski-Bang
谢谢你的帮助,但我遇到了这个错误 snake.h:37:16: error: assignment to expression with array type 37 | snake->pos = pos_ - Amir reza Riahi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接