malloc和sizeof时出现分段错误

时间:2019-03-02 23:58:33

标签: 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;
}

2 个答案:

答案 0 :(得分:4)

empty只是一个指针变量-它包含“某个”地址,但在Space上下文中仍是局部变量。如果要更新int *pSpace的值,则需要传递一个指向它的指针:


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 *。变量emptymain中指针的副本。当您更改Space中的值时,由于它是一个副本,因此更改永远不会将其返回到main

我将sizeof(p)更改为sizeof(int)。这更多是出于个人喜好,但我尝试仅将类型作为sizeof的参数。将sizeof应用于变量时,您会得到令人惊讶的结果。

我真的很喜欢@DIMMSum的答案,但是我知道指针指向指针可能会造成混淆,尤其是在开始时。