从函数返回指针而不将变量定义为静态?

时间:2016-10-30 20:14:27

标签: c

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

int* func();
int main(void) {

int *b = NULL,i;
b = func();
for(i=0;i<7;i++)
{
    printf("%d\n",*b);
    b++;
}
}

int * func()
{
    int *p;
     p = malloc(sizeof(int) * 7);
     int arr[]={1,2,3,4,5,6,7}; //without using static
     p = arr;
    return p;
}

如何将数组的地址返回到main函数来打印值?如果我们在堆中为数组分配内存,那么我们可以将数组作为指针传递给函数吗?

2 个答案:

答案 0 :(得分:1)

你很亲密,但并不完全。

以下表达导致p指向arr的地址,这不是预期的效果

p = arr;

请记住,p是一个指针,如果你不使用解除引用运算符*,那么你正在引用指针地址而不是它的。当函数退出时,arr的内存被释放,并且内存malloc到p 丢失 ,因为你重新分配了地址 p到指向本地变量arr的地址

解决方案是使用for循环将arr的复制到p:

int i = 0;
for (; i < 7; ++i) {
  p[i] = arr[i];
}

这将打印所需的结果,因为您将p 指向替换为p本身的地址

答案 1 :(得分:0)

你做不到。当你离开函数时,数组就消失了,当你离开函数时,任何指向数组的指针都会有一个不确定的值,并且以任何方式使用这样的指针都会调用未定义的行为。

你的malloc()调用毫无意义并导致内存泄漏,因为你在堆上为7个int分配空间,然后覆盖指针,因此永远不能使用或释放​​内存。