Я могу возвратиться дважды * в функции?

Я могу сделать что-то вроде этого? Это будет работать?

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 является числом элементов.

5
задан Andrew Medico 22 January 2010 в 21:42
поделиться

7 ответов

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

В основном вы можете выделить память внутри 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); 

не забывайте на бесплатно результат вызова VEC_SUBTRICTION когда-то позже.


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

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).
11
ответ дан 18 December 2019 в 07:54
поделиться

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

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

     ...

     return result;
}

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

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

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


         ...

}

тогда в главном:

 double result[n];
 vec_subtraction(..., result);
3
ответ дан 18 December 2019 в 07:54
поделиться

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

2
ответ дан 18 December 2019 в 07:54
поделиться

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

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
ответ дан 18 December 2019 в 07:54
поделиться
[112885745-

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

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

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

free(vec);

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

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

, позвонив на это так:

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

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

Удачи!

1
ответ дан 18 December 2019 в 07:54
поделиться

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

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

Прямо сейчас вы определили A и B в качестве указателей на CHAR, но вы наличия функции возвращают указатель на двойной. Это безвредно, но, вероятно, бессмысленно и расточительно. Что намного хуже, это то, что вы тогда передаете эти два удваивания printf с преобразованием «% d», поэтому он пытается лечить как целые числа вместо удваиваний (вы будете печатать двойной с «% F "). Результатом в этом случае является неопределенным поведением.

1
ответ дан 18 December 2019 в 07:54
поделиться
- 4585744-

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

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

, и теперь это становится ответственностью вызывающего абонента, чтобы освободить эту память.

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

0
ответ дан 18 December 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: