Назначить возвращенный указатель на массив - PullRequest
0 голосов
/ 29 июля 2010

У меня есть функция, возвращающая float *, где она на самом деле заполнена как массив в возвращаемой функции, так что

float* some_fnc()
{
    float *x=malloc(sizeof(float)*4);
    x[0]=......
}
...
// in main
float y[4];
y=some_fnc();

однако я получаю ошибку "Несовместимые типы", это нормально? Есть ли способ преодолеть это без объявления y как float *?

Ответы [ 4 ]

5 голосов
/ 29 июля 2010

C не поддерживает / не позволяет присваивать массивы (даже если он поддерживает инициализацию массивов, что может выглядеть как присваивание). У вас есть несколько вариантов выбора. Одним из них является передача адреса массива функции и заполнение существующего массива вместо выделения места для него:

void some_func(float *array, int size) { 
    for (i=0; i<size;i++)
       array[i] = ...
// ...
}

Другой возможностью было бы просто иметь указатель в main для хранения указателя, возвращаемого функцией:

float *y = some_fnc();
// use y. Note that array style notation (y[0], y[1], etc.) is still allowed.

// when you're done with y.
free(y);
0 голосов
/ 30 июля 2010

Как уже упоминалось другими, вы пытаетесь назначить указатель на массив, и это не работает.Если вы действительно хотите это сделать, вместо этого вы можете использовать структуру.

struct foo { float f[4]; }

struct foo some_fnc()
{
    struct foo x;

    x.f[0] = 0.1;
    x.f[1] = 1.0;
    x.f[2] = 3.14159;
    x.f[3] = 42;

    return x;
}
...
// in main
struct foo y;
y = some_fnc();

Другой вариант - передать адрес от y до some_fnc:

void some_fnc( float x[4])
{
    x[0]=......
}
...
// in main
float y[4];
some_fnc(y);
0 голосов
/ 30 июля 2010

В вашем коде вы в основном выделяете два разных массива, один в стеке, а другой с malloc.Даже если бы вы могли назначить массивы в C (чего вы не можете), массив, выделенный с помощью malloc, будет вызывать утечку памяти каждый раз, когда вы будете вызывать свою функцию, поэтому вам определенно не следует делать это таким образом.* Так что, если вы хотите разместить свой массив в куче с помощью malloc, нет другого способа, кроме как определить его как float*.Если вы это сделаете, не забудьте free, откуда вам это больше не нужно.

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

0 голосов
/ 29 июля 2010

Вы не можете изменить адрес массива. Почему бы вам не передать y в качестве параметра some_fnc? (или) вы могли бы просто использовать указатель с плавающей точкой, если вы знали размер только во время выполнения и не использовали массив в main.

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