Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和sizeof时的分段错误_C_Segmentation Fault - Fatal编程技术网

malloc和sizeof时的分段错误

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只是一个指针变量—它包含一些地址,但在空间上下文中仍然是一个局部变量。如果要在空

很抱歉,如果我冒犯了任何人,但我本周开始学习C,在编译时遇到了一个分段错误。请给我第二双眼睛来帮我纠正这个错误好吗

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;
}