【问题标题】:c function return static variablec函数返回静态变量
【发布时间】:2015-08-17 18:16:24
【问题描述】:

我有一个关于 C 函数如何返回静态变量的问题:

data.h 文件中:

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

typedef struct
{
   int age;
   int number;
} person;

person * getPersonInfo();

data.c

#include "data.h"
static struct person* person_p = NULL;

person * getPersonInfo()
{
   person_p = (struct person*)malloc(10 * sizeof(struct person));
   return person_p;
}

main.c

#include "data.h"

int main()
{
   person* pointer = getPersonInfo();
   return 0;
}

函数getPersonInfo()返回一个指针,它是data.c中的静态指针,这是否允许且合法?在main.c中,函数getPersonInfo()可以这样使用吗:person* pointer = getPersonInfo();

【问题讨论】:

  • Do not cast the return value of malloc(),这里的static跟作用域有关,sotrage对于全局变量来说总是static的。
  • 这是什么意思“这个上下文中的静态与范围有关,对于全局变量来说,sotrage总是静态的”
  • 在函数内使用static意味着该变量具有static存储类,这导致它保留了对函数的调用,static在文件范围内意味着你不能externalize 变量/函数到不同的.c 文件。
  • static 关键字影响 2 件事,可见性(取决于链接)和生命周期。使用 static 声明具有全局范围的变量是多余的。
  • 函数getPersonInfo()返回一个指针person_p保存值(malloc的返回值,副作用为person_p)。

标签: c arrays pointers static


【解决方案1】:

线

static struct person* person_p = NULL;  

声明一个变量person_p,它具有静态存储持续时间、文件范围和内部链接。这意味着它只能在文件data.c 中通过名称引用,并且内部链接将其共享限制在该单个文件中。

静态存储持续时间意味着一旦将内存分配给person_p,只要程序运行,它就会一直保持在相同的存储位置,从而可以无限期地保留其值。这意味着您可以返回指向该位置的指针。
因此,您的代码是有效且合法的。

【讨论】:

  • 但是指针被定义为静态的,只在data.c中可见
  • 这是对帖子的回答,还是对 cme​​ts 中特定后续问题的评论???
  • 问题是关于从函数中返回指针。但是答案是关于返回指向静态变量的指针,不是吗?还是我没有走上正轨?
  • @Gopi; OP 提出的问题:函数getPersonInfo() 返回一个指针,该指针是data.c 中的静态指针,这是否允许且合法?
  • @ratzip,person_p 具有内部链接(作为static,文件范围变量)与函数是否可以返回其值的副本无关>。变量是静态的,而不是它的值。然而,事实上,返回一个指向变量的指针 (&amp;person_p) 也可以,这与返回变量本身非常接近。
【解决方案2】:

person_p 是一个变量,其范围仅适用于文件data.c,因为它是一个静态变量。您正在使用此变量在堆上分配一些内存并将地址返回到main.c,并且在 main.c 中有一个变量保存此值,即pointer

所以在这里你不是返回变量,而是变量持有的值,这完全没问题,因为即使变量超出范围,返回的值(即地址)在堆上仍然有效。

【讨论】:

    【解决方案3】:

    这是合法的,正如其他答案中已经指出的那样。您甚至可以将您的 data.c 重写为:

    #include "data.h"
    static struct person person;
    
    person * getPersonInfo()
    {
       return &person;
    }
    

    这将返回一个指向数据内存中结构的指针,而无需先在堆上分配它。 static 关键字与符号 person 的范围差不多(data.c 的本地),但数据本身在您的程序中是全局有效的。

    【讨论】:

      猜你喜欢
      • 2011-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多