指针初始化为null,更改为0x1

时间:2016-10-08 21:09:02

标签: c

我需要处理一个c程序有点麻烦(必须是c,而不是c ++)。

我有一个名为list的struct typedef。我有这个功能:

void init(list * l){
    l=malloc(sizeof(list));
    l->data=NULL;
    l->index=NULL;
    l->next=NULL;

    printf("Pointer= %p\n", (void *) l->next);
}

回到另一个档案,我有这个

list l;
printf("malloc\n");
init(&l);
printf("Pointer= %p\n", (void *) l.next);

这个的输出是(当在下面的操作系统上时):

malloc
Pointer= (nil)
Pointer= 0x1

有人可以向我解释这突然从NULL变为0x1吗?当我尝试使用它作为0x1显然不等于null并且我最终得到段错误时,它真的搞砸了我。

此代码在我的macbook上工作正常,但在CentOS和Ubuntu 16.04上它会生成上述输出。 无论如何我可以确保它保持为NULL吗?我是傻瓜吗?

由于

3 个答案:

答案 0 :(得分:0)

您需要做的是将双指针传递给init(),或让init()返回指针。

在C中,所有值都由传递。因此,当您将指针传递给init()时,您会传递list的内存位置。执行init()时,调用l时,malloc()变量中传递的值会被覆盖。但是,更新传递的指针。这仍然指向局部变量list l的内存位置。

答案 1 :(得分:0)

执行list l;已为l分配内存。这种记忆的地址可以通过&l获得。

您传递给init的内容本质上是一个数字,即内存中的地址(例如0x0000)。执行init后,l具有地址(0x0000)的值。 l的类型为list*这一事实意味着l*对象的地址(list)。

malloc分配新内存(在本例中为sizeof(list))并返回其所在位置的地址(数字)。从本质上讲,l的价值实际上已经发生变化,因为malloc提供的地址与您调用init的地址不同。

删除malloc可以解决问题。

答案 2 :(得分:0)

目前,您的init函数会分配一个新对象并填充该对象中的值。这个新的动态分配对象与list l;中分配的main无关。

为避免混淆,我建议使用函数参数的名称而不是main中的变量,因为它们可能会引用不同的对象。

如果您删除了l=malloc(sizeof(list));行,则init中的其余代码将更新list l;main所定义的present(alertController, animated: true /** or false */, completion: nil) ,您应该会看到预期产出。