通过引用 C 传递时结构内的指针不会改变
Pointer inside a structure not changing when passing by reference C
所以,我是 C 语言的新手,我的教授已经通过了一个用 C 语言制作游戏的项目。我的问题是,我创建了一个像这样的结构:
typedef struct vector
{
int parts;
int dir;
} Vector;
typedef struct snake
{
Vector* parts;
Vector dir;
} Snake;
我正在尝试初始化此函数中的 parts
指针:
void init_snake(struct snake *snake, int size, int x, int y)
{
snake->parts = (Vector *)malloc(sizeof(Vector) * size);
for (int i = 0; i < size; i++)
{
//sets the body parts one after the other in a line
snake->parts[i].x = x - i * PIXEL_SIZE;
snake->parts[i].y = y;
}
//sets the snake direction to the left
snake->dir.x = 1;
snake->dir.y = 0;
}
但是通过这样做,蛇指针中的数组 parts
没有按预期初始化。通过使用 sizeof(snake.parts) / sizeof(Vector)
检查它的大小 returns 0。关于如何修复它有什么想法吗?
它可能有效,您只是对 sizeof
感到困惑。此运算符测量 type 的大小(以字节为单位)。如果您要求一个值的大小,它会使用该表达式的类型。
这是编译时评估,因此不是动态的。
sizeof(snake.parts)
与 sizeof(Vector*)
相同,后者是 4 字节还是 8 字节,具体取决于您编译的是 32 位还是 64 位目标。因此,确定分配的大小没有用。
通常,给定一个指针,您无法判断分配有多大。通常这是通过在其他地方存储某种有用的长度来处理的。例如,您可以修改 struct snake
以包含 parts
:
的元素计数
typedef struct snake
{
Vector* parts;
int parts_size;
Vector dir;
} Snake;
并相应地设置这个值:
snake->parts = (Vector *)malloc(sizeof(Vector) * size);
snake->parts_size = size;
所以,我是 C 语言的新手,我的教授已经通过了一个用 C 语言制作游戏的项目。我的问题是,我创建了一个像这样的结构:
typedef struct vector
{
int parts;
int dir;
} Vector;
typedef struct snake
{
Vector* parts;
Vector dir;
} Snake;
我正在尝试初始化此函数中的 parts
指针:
void init_snake(struct snake *snake, int size, int x, int y)
{
snake->parts = (Vector *)malloc(sizeof(Vector) * size);
for (int i = 0; i < size; i++)
{
//sets the body parts one after the other in a line
snake->parts[i].x = x - i * PIXEL_SIZE;
snake->parts[i].y = y;
}
//sets the snake direction to the left
snake->dir.x = 1;
snake->dir.y = 0;
}
但是通过这样做,蛇指针中的数组 parts
没有按预期初始化。通过使用 sizeof(snake.parts) / sizeof(Vector)
检查它的大小 returns 0。关于如何修复它有什么想法吗?
它可能有效,您只是对 sizeof
感到困惑。此运算符测量 type 的大小(以字节为单位)。如果您要求一个值的大小,它会使用该表达式的类型。
这是编译时评估,因此不是动态的。
sizeof(snake.parts)
与 sizeof(Vector*)
相同,后者是 4 字节还是 8 字节,具体取决于您编译的是 32 位还是 64 位目标。因此,确定分配的大小没有用。
通常,给定一个指针,您无法判断分配有多大。通常这是通过在其他地方存储某种有用的长度来处理的。例如,您可以修改 struct snake
以包含 parts
:
typedef struct snake
{
Vector* parts;
int parts_size;
Vector dir;
} Snake;
并相应地设置这个值:
snake->parts = (Vector *)malloc(sizeof(Vector) * size);
snake->parts_size = size;