抱歉,如果我冒犯了任何人,但是我本周开始学习C,并且在编译此代码时遇到了段错误。我可以请另一只眼睛帮助我解决此错误吗?
void Space(void *empty, size_p s)
{
empty = malloc(s);
}
int main()
{
int *p = NULL;
Space(p, sizeof(p));
*p = 7;
return;
}
答案 0 :(得分:4)
empty
只是一个指针变量-它包含“某个”地址,但在Space
上下文中仍是局部变量。如果要更新int *p
中Space
的值,则需要传递一个指向它的指针:
int main()
{
int *p = NULL;
Space(&p, sizeof *p);
*p = 7;
return;
}
void Space(void **empty, size_p s)
{
*empty = malloc(s);
}
此外,您在调用Space
时遇到了一个错误:Space(p, sizeof(p));
sizeof(p)
是int *
变量的大小,但是您要分配int
的大小,因为这就是您存储在p
中的大小。因此,该行应为:
Space(&p, sizeof *p);
答案 1 :(得分:1)
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;
}
您可以更改Space
函数以返回void *
或int *
。变量empty
是main
中指针的副本。当您更改Space
中的值时,由于它是一个副本,因此更改永远不会将其返回到main
。
我将sizeof(p)
更改为sizeof(int)
。这更多是出于个人喜好,但我尝试仅将类型作为sizeof
的参数。将sizeof
应用于变量时,您会得到令人惊讶的结果。
我真的很喜欢@DIMMSum的答案,但是我知道指针指向指针可能会造成混淆,尤其是在开始时。