链表中的内存

时间:2015-04-25 09:50:06

标签: c

我一直在用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 = NULLld = NULL (again)。为什么?我认为应该只有第一个printf,因为起初行while(ld!=NULL) ld = ld->next什么都不做。

奇怪的是:如果删除行ld = aux;,输出就可以了,只需:ld = NULL

编辑:问题是:auxldaux = ld而指向同一内存。因此,如果我为ld保留内存,则会立即aux更改并且不会指向NULL,对吧?

3 个答案:

答案 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 的值),因此两个条件测试始终打印相同。