输出会将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
答案 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
,如前所述,或者传递指向函数的指针(从而避免malloc
和free
),保持堆栈上的分配调用函数。
即。 (这可能不起作用,它没有经过测试,只是为了证明这个想法):
#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 + 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;
}
这可能会奏效。