我一直在用C语言编写一个简单的游戏来学习编程,但是当我使用链表时我的代码中发现了一个错误。
这是我的struct
:
typedef struct ListShoots * ListShoots;
struct ListShoots{
Shoot d;
ListShoots next;
};
我的记忆功能:
ListShoots Shoots_Create(int x, int y){
ListShoots ld = malloc(sizeof(struct ListShoots));
ld->d.alto = 10;
ld->d.x = x;
ld->d.y = y;
ld->d.v = 6;
ld->next = NULL;
return ld;
}
void Shoots_Shoot(ListShoots ld, int x, int y){
ListShoots aux = ld;
if(ld==NULL) printf("ld = NULL\n");
while(ld!=NULL) ld = ld->next;
ld = Shoots_Create(x,y);
ld = aux;
if(ld==NULL) printf("ld = NULL (again)\n");
}
当我调用main中的函数Shoots_Shoot
时(首先是ld = NULL
),我得到了输出:ld = NULL
和ld = NULL (again)
。为什么?我认为应该只有第一个printf
,因为起初行while(ld!=NULL) ld = ld->next
什么都不做。
奇怪的是:如果删除行ld = aux;
,输出就可以了,只需:ld = NULL
。
编辑:问题是:aux
和ld
因aux = ld
而指向同一内存。因此,如果我为ld
保留内存,则会立即aux
更改并且不会指向NULL
,对吧?
答案 0 :(得分:1)
...我得到输出:“ld = NULL”和“ld = NULL(再次)”。 ¿为什么呢?
因为
ListShoots aux = ld;
/* ... */
ld = aux;
您正在恢复ld
的原始值,显然是NULL
,因为您正在
ld = NULL
来自
if(ld==NULL) printf("ld = NULL\n");
答案 1 :(得分:0)
关于您所描述的具体问题,请查看您的功能
void Shoots_Shoot(ListShoots ld, int x, int y){
ListShoots aux = ld;
if(ld==NULL) printf("ld = NULL\n");
while(ld!=NULL) ld = ld->next;
ld = Shoots_Create(x,y);
ld = aux;
if(ld==NULL) printf("ld = NULL (again)\n");
}
第一行在ld
变量中存储aux
的传入值。然后,如果ld
为空,则打印。
稍后您更改ld
ld = Shoots_Create(x,y);
但是在(在printf之前)之后,您再次返回其原始值并使用下一行
ld = aux;
所以基本上两个条件都测试相同的值(传递给函数的ld
的值)。这就是删除行
ld = aux;
它有效 - 因为那样你就不会改变Shoots_Create(x,y)
函数的返回值
答案 2 :(得分:0)
- 辅助和 ld 指向同一个内存:
ListShoots aux = ld;
- 但是现在如果这个循环至少完成一次它们没有指向同一个内存:
while(ld!=NULL) ld = ld->next;
- 现在 ld 指向另一个空间内存,因为malloc,而 aux 仍然指向同一个地方:
ld = Shoots_Create(x,y);
- 你记得你说过 aux 在开头指向NULL吗?好吧,现在 ld 再次指向与 aux 相同的内存。这意味着NULL:
ld = aux;
Aux 始终是相同的值(方法启动时 ld 的值),因此两个条件测试始终打印相同。