Динамическое распределение массива внутри функции

0

Я пытаюсь malloc и инициализировать массив и возвращать его вызывающей функции через переданный в указателе. (g++)

Пример:

float* buff;
allocateBuff(&buff);
buff[0] = 2.3;
free(buff);

int allocateBuff(float** buffer)
{
  *buffer = (float*) malloc(sizeof(float)*1);

   return 0;
}

Однако, это seg ошибки.

  • 2
    malloc() , free() в c++ ? Не совсем хорошая практика. Тем не менее, можете ли вы предоставить нам больше информации, используя gdb ?
  • 3
    работает нормально (без segfaults) для меня, используя g++ 4.8.1
Показать ещё 9 комментариев
Теги:

3 ответа

0

Попробуйте что-то вроде этого:

int allocate(float **buffer)
{
    *buffer = new float(2.3f);
    return 0;
}

int allocateAsArray(float **buffer, unsigned size)
{
    *buffer = new float[size];
    return 0;
}

int main()
{
    float* buff = nullptr;
    // some operations ...
    delete buff;
    // or delete[] buff;
    return 0;
}

Но использование указателей типа C не является хорошей идеей в C++ (мы предпочитаем интеллектуальные указатели/массивы STL для большей безопасности).

0

Хорошо, вышеприведенный код работает, он был неисправен в другом месте. Спасибо за все отклики.

  • 1
    Вы должны научиться использовать отладчик. Запуск программы с отладчиком покажет вам точное место, где произошла ошибка.
0

function return должен соответствовать типу указателя, который вы хотите вернуть. Если вы хотите выделить массив float, ваша функция должна иметь тип float *. Ниже приведен краткий пример:

#include <stdio.h>
#include <stdlib.h>

float *allocateBuff(float** buffer, int size)
{
    /* allocate array of floats */
    *buffer = calloc(size, sizeof(*buffer));

    return *buffer;
}

int main() {

    float *array = NULL;
    array = allocateBuff (&array, 10);

    int i;

    for (i = 0 ; i < 10; i++)
        array[i] = (float)i;

    for (i = 0 ; i < 10; i++)
        printf ("array [%d] : %f\n", i, array[i]);

    if (array) free (array);

    return 0;
}

вывод:

$ ./bin/initfloat
array [0] : 0.000000
array [1] : 1.000000
array [2] : 2.000000
array [3] : 3.000000
array [4] : 4.000000
array [5] : 5.000000
array [6] : 6.000000
array [7] : 7.000000
array [8] : 8.000000
array [9] : 9.000000

Кроме того, нет необходимости передавать buffer в функцию вообще. Вы можете так же легко определить свою функцию как:

float *allocateBuff (int size)
{
    /* allocate array of floats */
    float *buffer = calloc (size, sizeof(*buffer));

    return buffer;
}

и затем инициализируйте свой массив в своем коде с помощью:

float *array = NULL;
array = allocateBuff (10);
  • 0
    Нет необходимости фактически возвращать указатель, если он может быть передан по значению, как это делает OP.
  • 0
    Вы на 100% правы. В этом разница между передачей address of the buffer в качестве аргумента или нет. Если адрес передается в качестве аргумента, тогда нет необходимости присваивать возврат.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню