c函数返回静态变量

时间:2015-06-03 13:37:06

标签: c arrays pointers static

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

<{1>}文件中的

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

function #include "data.h" int main() { person* pointer = getPersonInfo(); return 0; } 返回一个指针,它是getPersonInfo()中的静态指针,这是允许的还是合法的吗?在data.c中,函数main.c可以像这样使用:getPersonInfo()

3 个答案:

答案 0 :(得分:2)

static struct person* person_p = NULL;  

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

#include "data.h"
static struct person person;

person * getPersonInfo()
{
   return &person;
}

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