Могу ли я вернуть double * в функции? - PullRequest
5 голосов
/ 23 января 2010

Могу ли я сделать что-то подобное? Будет ли это работать?

double *vec_subtraction (char *a, char *b, int n)
{   
    double *result;
    int i;

    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];

    return result;
}

и затем в основном:

double *vec=vec_substraction(a, b, n);
for(i=1; i<n; i++)         
    printf("%d", vec[i]);

a и b - векторы с одинаковым количеством элементов, n - количество элементов.

Ответы [ 7 ]

11 голосов
/ 23 января 2010

Да, вы можете, но вам нужно где-то выделить память для result.

По сути, вы можете выделять память либо внутри vec_subtraction, либо снаружи vec_subtraction, если вы выделяете снаружи, вы можете делать это статически или динамически.

Если вы собираетесь выделить внутри:

double *vec_subtraction (char *a, char *b, int n) {
    double *result = malloc(sizeof(double)*n);
    int i;
    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];

    return result;
}

и в основном:

double *vec;
// ...
vec = vec_subtraction(a, b, n);
// ...
free(vec); 

Не забудьте free результат вызова vec_subtraction через некоторое время.


Если вы собираетесь выделять вне, вам нужно передать указатель на память:

void vec_subtraction (char *a, char *b, int n, double *result) {
    int i;
    for(i=0; i<n; i++)
        result[i] = a[i]-b[i];
}

в основном:

// choose one of:
// double *vec = malloc(sizeof(double)*n);
// double vec[10]; // where 10= n.
vec_subtraction(a, b, n, vec);

// if you used *vec = malloc... remember to call free(vec).
3 голосов
/ 23 января 2010

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

double *vec_subtraction( ... ) {
     double *result = malloc(sizeof(double)*n);

     ...

     return result;
}

Тогда все остальное будет работать. Вы должны помнить, чтобы освободить память, хотя.

Другой вариант:

void vec_subtraction( ..., double *result ) {


         ...

}

Тогда в основном:

 double result[n];
 vec_subtraction(..., result);
2 голосов
/ 23 января 2010

Вы, безусловно, можете вернуть двойной * из функции. Просто убедитесь, что указатель по-прежнему указывает на действительный объект. например не делай этого:

double *vec_subtraction (char *a, char *b, int n) {
double result[n];
int i;

for(i=0; i<n; i++)
    result[i] = a[i]-b[i];

    return &result[0]; //error,the local array will be gone when the function returns.
}

Это было бы хорошо, хотя:

double *vec_subtraction (char *a, char *b, int n) {
double *result = malloc(sizeof(double)*n);
int i;
if(result == NULL)
   return NULL;

for(i=0; i<n; i++)
    result[i] = a[i]-b[i];

    return result; //remember to free() the returned pointer when done.
}
2 голосов
/ 23 января 2010

Можно, но, похоже, вы не выделяете память для вектора результата.

1 голос
/ 23 января 2010

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

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

Прямо сейчас вы определили a и b как указатели на char, но ваша функция возвращает указатель на double. Это безвредно, но, вероятно, бессмысленно и расточительно. Гораздо хуже то, что вы передаете эти двойные числа в printf с помощью преобразования "% d", поэтому он пытается обрабатывать целые числа вместо двойных (вы выведите двойное число с "% f"). Результатом в этом случае является неопределенное поведение.

1 голос
/ 23 января 2010

В вашей функции vec_subtraction у вас есть неинициализированная переменная в двойном * результате. Если вы хотите, чтобы это возвращало что-то значимое, вам нужно выделить немного памяти для массива, например,

result = malloc(sizeof(double) * n);

Тогда вы должны помнить, чтобы освободить его, когда закончите:

free(vec);

Однако, хорошей практикой (по крайней мере, когда я был C-кодером) было выделение памяти и свободной памяти в одной области, где это возможно, конечно, по возможности. Поэтому на самом деле вы должны передать свой массив в функцию vec_subtraction. Вам нужно изменить подпись вашей функции на:

vec_subtraction (char *a, char *b, int n, double *result)

называя это так:

double vec[n];
...
vec_subtraction (a, b, n, &result);

Извините, мой псевдо-c, но, надеюсь, вы поняли идею.

Удачи!

0 голосов
/ 23 января 2010

Это будет работать, если вы выделите какую-либо память для результатов:

result = malloc(sizeof(*result) * n);

И теперь вызывающая сторона несет ответственность за освобождение этой памяти.

Вызывающая сторона может также передать двойной массив для заполнения результатами, и в этом случае вы можете не использовать динамически размещенный массив.

...