好的,所以我对 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
指向你在堆栈上的结构! &walker
是 walker
的地址,您将其分配给您的指针。您可能想要做的是复制结构。为此,您必须取消引用您的指针:
*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/