Ошибка сегментации при malloc и sizeof - PullRequest
0 голосов
/ 03 марта 2019

Извините, если я кого-то обидел, но я начал изучать 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 голосов
/ 03 марта 2019
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, но я знаю, что указатель на указатель может сбивать с толку, особенно при запуске.

0 голосов
/ 03 марта 2019

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

...