c - 在 c 中使用结构指针的奇怪问题

标签 c struct pass-by-reference

好的,所以我对 c 中的结构完全陌生,我遇到了一个对我来说似乎很奇怪的问题。
当使用它的指针将一个简单的结构传递给一个函数时,该结构会自动采用该函数的其他参数之一作为它的新数据。我不知道为什么会这样.. 此时 move_walker() 应该什么都不做,对吧?

typedef struct {
    int x,
        y;
} walker_t;

walker_t* init_walker(int x, int y) {
    walker_t walker;
    walker.x = x;
    walker.y = y;
    walker_t *pointer = malloc(sizeof(walker));
    pointer = &walker;
    return pointer;
}

int move_walker(walker_t * walker, int direction) {
    return 0;
}

walker_t* walker;
walker = init_walker(8,2);

printf("%d %d\n", walker->x, walker->y); //will print '8 2'
move_walker(walker, 3);
printf("%d %d\n", walker->x, walker->y); //will print '0 3'

(我很确定这没关系,但这段代码实际上分布在多个文件中。)

最佳答案

问题是您的 walker 指针指向无效的堆栈内存,因为 init_walker 有一个错误:您在堆栈,然后使用 malloc 保留内存并将该内存的地址分配给 pointer。到目前为止一切顺利。

但是,pointer = &walker没有将结构从堆栈复制到新内存,而是使 pointer 指向你在堆栈上的结构! &walkerwalker 的地址,您将其分配给您的指针。您可能想要做的是复制结构。为此,您必须取消引用您的指针:

*pointer = walker

这应该使您的程序按预期工作。您也可以完全跳过堆栈上的结构:

walker_t* init_walker(int x, int y) {
    walker_t *walker = malloc(sizeof(walker_t));
    walker->x = x;
    walker->y = y;
    return walker;
}

关于c - 在 c 中使用结构指针的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14956649/

相关文章:

C - 是否可以从 for 循环中递减 for 循环的最大值?

c - 线程在函数返回后停止

c - 不兼容的指针类型警告重新指向 int 指针数组的指针

ios - 应用程序退出后 Swift Struct bool 值会重置

c - 关于 main 函数,全局变量和局部变量有什么区别?

c - 按值将 C 结构返回给 Julia

c - C中的指针 - 构造矩阵时为 "Segmentation Fault"

java - Java中如何使用引用?

c# - 如何在 C# 中调用方法外使用 ref 变量

c - 函数内部的 malloc/按引用调用/valgrind