我有以下结构和一个初始化它的函数(typedef 取自 .h 和 snake_init()
来自 .c):
typedef struct snake_t {
size_t len;
int *x, *y;
int *head_x, *head_y;
} Snake;
Snake *snake_init(int x, int y) {
Snake *s = malloc(sizeof(*s) + 2 * sizeof(int));
s->len = 1;
s->x = (int *) (s + 1);
s->y = (int *) (s + 2);
*(s->x) = x;
*(s->y) = y;
s->head_x = s->x;
s->head_y = s->y;
return s;
}
还有我的 main.c(仅显示 int main()
):
int main(int argc, char *argv[]) {
Snake *s = snake_init(12, 1234);
// 12 1234
printf("*x: %d *y: %d\n", *(s->x), *(s->y));
// 12 1234
printf("*head_x: %d *head_y: %d\n", *(s->head_x), *(s->head_y));
// 1 1
printf("x == head_x: %d y == head_y: %d", s->x == s->head_x, s->y == s->head_y);
return 0;
}
即使它们指向相同的地址,s->y
和 s->head_y
在取消引用时具有不同的值。 s->x
和 s->head_x
没有这个问题。上面的代码有什么问题?和snake_init()
中s->x
和s->y
的初始化有关系吗?
最佳答案
+-------+---+---+
| snake | x | y |
+-------+---+---+
s s+1
为了访问“snake”之后的整数,请执行以下操作
int* x = (int *)(s+1);
int* y = (int *)(s+1) + 1;
s->x = x;
s->y = y;
关于c - 数组第一个索引和指向第一个索引的解引用指针的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447020/