c - 数组第一个索引和指向第一个索引的解引用指针的不同值

标签 c

我有以下结构和一个初始化它的函数(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->ys->head_y 在取消引用时具有不同的值。 s->xs->head_x 没有这个问题。上面的代码有什么问题?和snake_init()s->xs->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/

相关文章:

c - 以特殊格式将空字符串与scanf匹配的问题

c - 等距瓷砖拾取/选择算法

c - 文字操作数的类型

c - strtok() 作为 printf() 中的参数反向打印值

c - 如何将空参数传递给函数

c - 缓冲 io 和非缓冲 io 之间的区别

c - 如何在C中添加时间?

java - jni 中的回调

c - 使用 libxml2 在现有 XML 中附加数据

c - 无线程的 C 语言非阻塞库 API