如何从函数返回float数组?

时间:2016-03-07 12:38:48

标签: c arrays function pointers return

输出会将k的值显示为0.000,但它应包含从funcTest()返回的实际值。

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

float *funcTest(int *a, int size)
{
    float p[size];
    int i;
    for(i=0; i< size; i++){
        p[i] = *a;
        p[i]=p[i]/2;
        a++;
    }
    for(i =0; i<size; i++){
        printf("%f\n",p[i]);
    }
    return (float *)p;
}

int main()
{
    int a[4] = {1,5,3,7};
    int size = 4;
    int i,j;
    float *k;
    k = funcTest(&a[0],size);
    for(i =0; i<size; i++){
        printf("%f\n",*k);
        k++;
    }
    return 0;
}

输出:

0.5
2.5
1.5
3.5
1.5
0.000
0.000
0.000

5 个答案:

答案 0 :(得分:3)

您返回一个局部变量。所以,在函数结束时,局部变量被清理,不再存在。您应该使用malloc

float *funcTest(int *a, int size)
{
    float *p = malloc(sizeof(float) * size);

当你不再使用free时,不要忘记释放内存。如果你忘了,你会有内存泄漏

答案 1 :(得分:2)

在您的代码中,float p[size];是函数funcTest()的本地函数,因此您无法从函数返回它的地址并期望它在调用者中有效。 funcTest()函数结束后,p将不复存在。然后,由于无效的内存访问,任何使用返回值的尝试都将导致undefined behavior

相反,您可以使p成为指针,使用malloc()或系列动态分配内存,然后将该指针返回给调用者。动态分配的内存的生命周期将等于程序的整个执行(除非手动解除分配),因此,即使从函数返回后,在调用者中,返回的指针也是有效的。

答案 2 :(得分:2)

p是一个自动局部变量,一旦函数返回就不再存在。返回指向它的指针将调用未定义的行为。

动态分配p

float *p = malloc(size*sizeof(float)); 

完成后释放已分配的内存

float *k;
k = funcTest(&a[0],size);
if(k == NULL)             // Check for null pointer
    exit(0);
float *temp = k;
for(i =0; i<size; i++){
    printf("%f\n",*k);
    k++;
}
free(temp);              // Free allocated memory
return 0;

答案 3 :(得分:2)

正如我之前的人所指出的那样,你试图返回一个堆栈分配变量(函数中的局部变量),这意味着一旦函数退出,你指向的内存就不会有效(它清除某些实现,但实际上它的行为尚未定义。)

解决方案是使用malloc,如前所述,或者传递指向函数的指针(从而避免mallocfree),保持堆栈上的分配调用函数。

即。 (这可能不起作用,它没有经过测试,只是为了证明这个想法):

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

int funcTest(float *p, int *a, int size)
{
    int i;
    for(i=0; i< size; i++){
        p[i] = *a;
        p[i]=p[i]/2;
        a++;
    }
    for(i =0; i<size; i++){
        printf("%f\n",p[i]);
    }
    // we can use the return value for errors.
    return 0;
}

int main()
{
    int a[4] = {1,5,3,7};
    float p[4] = {0};
    int size = 4;
    int i;
    funcTest(p, a, size);
    for(i =0; i<size; i++){
        printf("%f\n",p[i]);
    }
    return 0;
}

另请注意,您不需要使用&a[0] - 数组是指针,因此aa[0]的内存地址,a + 1是内存地址a[1]

祝你好运!

答案 4 :(得分:0)

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

void funcTest(int *a, int size, float *output)
{
    output = (float *) malloc(sizeof(float) * size);
    int i;
    for(i=0; i< size; i++){
        output[i] = *a;
        output[i]=output[i]/2;
        a++;
    }
    for(i =0; i<size; i++){
        printf("%f\n",output[i]);
    }
}

int main()
{
    int a[4] = {1,5,3,7};
    int size = 4;
    int i,j;
    float *k;
    funcTest(&a[0],size, k);
    for(i =0; i<size; i++){
        printf("%f\n",k);
        k++;
    }
    return 0;
}

这可能会奏效。

  1. funcTest
  2. 中删除您的本地定义 float p [size];
  3. funcTest 中为输出指针添加一个参数 float * output
  4. funcTest 中为输出指针(浮点数组大小)分配内存,malloc sizeof(float)* size
  5. 将变量 p 替换为参数输出
  6. 无需返回,将返回类型从浮动* 更改为无效
  7. 修复 printf(&#34;%f \ n&#34;,k); k是一个地址。 * k是一个指针。