Проблема со следующим кодом - PullRequest
0 голосов
/ 28 мая 2011

Я хочу знать проблемы с кодом, представленным ниже. Кажется, у меня ошибка сегментации.

void mallocfn(void *mem, int size)
{
    mem = malloc(size);
}

int main()
{
    int *ptr = NULL;
    mallocfn(ptr, sizeof(ptr));
    *ptr = 3;

    return;
}

Ответы [ 4 ]

3 голосов
/ 28 мая 2011

должно быть что-то вроде:

void mallocfn(void **mem, int size)

void mallocfn(int **mem, int size)
{
    *mem = malloc(size);
}

int main()
{
    int *ptr = NULL;
    mallocfn(&ptr, sizeof(ptr));
    *ptr = 3;

    return;
}

Поскольку вам нужно отредактировать содержимое p, а не что-то указал b p, поэтому вам необходимо отправить адрес переменной p указателя в функцию выделения.

Также проверьте ответ @Will A

3 голосов
/ 28 мая 2011

Предполагая, что ваша оболочка вокруг malloc в вашем примере неверно названа (вы используете AllocateMemory в основной (...) функции) - поэтому я понимаю, что функция, которую вы называли malloc, на самом деле AllocateMemory вы передаете указатель на значение , устанавливая значение этого параметра как результат malloc, но когда функция вернет переданный указатель, не изменится.

int *ptr = NULL;
AllocateMemory(ptr, sizeof(ptr));
*ptr = 3; // ptr is still NULL here.  AllocateMemory can't have changed it.
1 голос
/ 28 мая 2011

Оставь всю эту идиому. Нет никакого способа сделать это в C без создания отдельной функции выделения для каждого типа объекта, который вы можете выделить. Вместо этого используйте malloc так, как это было задумано - указатель будет возвращен вам в возвращаемом значении. Таким образом, он автоматически преобразуется из void * в правильный тип указателя при назначении.

1 голос
/ 28 мая 2011

Придерживаясь вашего примера, правильное использование malloc выглядело бы так:

#include <stdlib.h>

int main()
{
   int *ptr = NULL;

   ptr = malloc(sizeof(int));
   if (ptr != NULL)
   {
      *ptr = 3;

      free(ptr);         
   }

   return 0;
}

Если вы изучаете CI, вы должны научиться читать сообщения об ошибках и приходить к этому.Вывод сам.Давайте разберем их:

prog.c:1: warning: conflicting types for built-in function ‘malloc’

malloc - это стандартная функция, и я думаю, gcc уже знает, как она объявлена, рассматривая ее как "встроенную".Обычно при использовании стандартных библиотечных функций вы хотите #include правильный заголовок.Вы можете выяснить, какой заголовок основан на документации (man malloc).

В C ++ вы можете объявить функции, которые имеют то же имя, что и уже существующие функции, с другими параметрами.C не позволит вам сделать это, и поэтому компилятор жалуется.

prog.c:3: warning: passing argument 1 of ‘malloc’ makes pointer from integer without a cast
prog.c:3: error: too few arguments to function ‘malloc’

Ваш malloc вызывает себя.Вы сказали, что первый параметр был void* и у него было два параметра.Теперь вы вызываете его с целым числом.

prog.c:8: error: ‘NULL’ undeclared (first use in this function)

NULL объявлено в стандартных заголовках, и вы не #include их.

prog.c:9: warning: implicit declaration of function ‘AllocateMemory’

Вы только что вызвали функциюAllocateMemory, не сообщая компилятору, как он должен выглядеть.(Или предоставляя реализацию, которая создаст ошибку компоновщика.)

prog.c:12: warning: ‘return’ with no value, in function returning non-void

Вы сказали, что main вернет int (как и должно быть), однако вы только что сказали return; без значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...