【问题标题】:Return pointer from a function without defining the variable as static?从函数返回指针而不将变量定义为静态?
【发布时间】:2017-03-13 00:05:39
【问题描述】:
#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;
}

如何将数组的地址返回给打印值的主函数??如果我们在堆中为数组分配内存而不将数组声明为静态,那么我们可以将数组作为指针传递给函数吗??

【问题讨论】:

    标签: c


    【解决方案1】:

    你已经很近了,但还不够。

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

    p = arr;
    

    记住,p 是一个指针,如果你不使用解引用操作符 *,那么你引用的是指针的 地址,而不是它的 。 arr 的内存在函数退出时被释放,分配给 p 的内存 lost 因为您将 p 的 地址 重新分配给 point指向local变量arr的地址

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

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

    这将打印所需的结果,因为您替换了 p 指向 而不是 p 本身的 地址。 p>

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 但是当我提到从函数传递变量时,他们通过为其分配内存而不是将其设为静态来完成。 int *fun() { int *point = malloc(sizeof *point); *点=12;返回点; } link
      • @GaneshNagendran,那么您必须按照答案之一的建议将静态数组元素复制到最近分配的缓冲区。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2022-11-21
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      相关资源
      最近更新 更多