2016-03-07 58 views
0

输出将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; 
} 

OUTPUT:

0.5 
2.5 
1.5 
3.5 
1.5 
0.000 
0.000 
0.000 
+1

p一旦离开方法“functest”就会被销毁。因此,您收到的指针根本无效。 – Taredon

回答

2

在你的代码,float p[size];是本地功能funcTest(),所以你不能从函数返回它的地址,并希望它是在调用者有效。一旦funcTest()功能结束,p将不复存在。然后,任何尝试使用返回值都会导致undefined behavior,因为无效的内存访问。

取而代之,您可以制作p指针,使用malloc()或家族动态分配内存,然后将该指针返回给调用者。动态分配的内存将具有与程序的整个执行期相等的生命周期(,除非手动解除分配),因此,即使在函数返回后,在调用方中,返回的指针也是有效的。

3

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

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

而且不要忘记,当你不free再使用它来释放内存。如果你忘记了,你将会发生内存泄漏

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; 
+0

非常感谢解决方案。它的工作.. :-) –

+1

@SouvikKundu不要忘记当你不再需要它时释放内存。如果你忘记了,你会有内存泄漏 – Garf365

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] - 阵列是在心脏指针,所以a是内存地址a[0],而a + 1a[1]的内存地址。

祝你好运!

+0

注意:没有必要返回数组。只需从'main'打印'p'即可。 –

+0

@CoolGuy - Yap,你说得对。我甚至没有看到代码的那一部分...我会解决这个问题:-) – Myst

+0

此外,不需要funcTest返回的东西,可以是'void funcTest(float * p,int * a,int大小)' – Garf365

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. 删除您的本地定义float p [size];funcTest
  2. 添加一个参数浮动*输出funcTest输出指针。
  3. 分配内存,在funcTest MALLOC的的sizeof(浮点)*大小输出指针(float数组的大小)。
  4. 将变量p代入参数输出
  5. 无需返回,将返回类型从浮动*更改为void
  6. 修复为printf(“%f \ n”,k); k是一个地址。 * k是一个指针。