我需要处理一个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吗?我是傻瓜吗?
由于
答案 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)
,您应该会看到预期产出。