malloc和sizeof时的分段错误
很抱歉,如果我冒犯了任何人,但我本周开始学习C,在编译时遇到了一个分段错误。请给我第二双眼睛来帮我纠正这个错误好吗malloc和sizeof时的分段错误,c,segmentation-fault,C,Segmentation Fault,很抱歉,如果我冒犯了任何人,但我本周开始学习C,在编译时遇到了一个分段错误。请给我第二双眼睛来帮我纠正这个错误好吗 void Space(void *empty, size_p s) { empty = malloc(s); } int main() { int *p = NULL; Space(p, sizeof(p)); *p = 7; return; } empty只是一个指针变量—它包含一些地址,但在空间上下文中仍然是一个局部变量。如果要在空
void Space(void *empty, size_p s)
{
empty = malloc(s);
}
int main()
{
int *p = NULL;
Space(p, sizeof(p));
*p = 7;
return;
}
empty只是一个指针变量—它包含一些地址,但在空间上下文中仍然是一个局部变量。如果要在空间中更新int*p的值,需要传递指向该值的指针:
int main()
{
int *p = NULL;
Space(&p, sizeof *p);
*p = 7;
return;
}
void Space(void **empty, size_p s)
{
*empty = malloc(s);
}
此外,您还有一个称为Space的bug:Spacep,sizeofp
SizeOff是int*变量的大小,但您希望分配int的大小,因为这是存储在p中的内容。因此,该行应改为:
Space&p,规模*p
您可以更改空格函数以返回void*或int*。变量empty是main中指针的副本。当您更改空间中的值时,因为它是一个副本,所以更改永远不会使其返回到main
我把sizeofp改为sizeofint。这更多的是个人偏好,但我尝试只将类型作为sizeof的参数。当您将sizeof应用于变量时,会得到令人惊讶的结果
我真的很喜欢@DIMMSum的答案,但我知道指针对指针可能会令人困惑,尤其是在开始时。Hm,您的代码有点奇怪-您需要一个参数,设置它,然后返回它。为什么不直接返回对malloc的调用并去掉第一个参数呢?但是,这也是可行的:-P.S.我个人认为不鼓励人们将sizeof应用于变量是不好的。该代码可以说更具可扩展性,因为您可以更改变量类型,并且sizeof计算仍然是正确的。@DIMMSum-我同意,通常我只会从调用malloc返回。我这样做是因为我认为这是显示代码更改的最简单的方法。什么是size-p?
void * Space(void *empty, size_t s)
{
empty = malloc(s);
return empty;
}
int main()
{
int *p = NULL;
p = Space(p, sizeof(int));
*p = 7;
return 0;
}