Я пытаюсь 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 ошибки.
Попробуйте что-то вроде этого:
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 для большей безопасности).
Хорошо, вышеприведенный код работает, он был неисправен в другом месте. Спасибо за все отклики.
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);
address of the buffer
в качестве аргумента или нет. Если адрес передается в качестве аргумента, тогда нет необходимости присваивать возврат.
malloc()
,free()
вc++
? Не совсем хорошая практика. Тем не менее, можете ли вы предоставить нам больше информации, используяgdb
?g++ 4.8.1