我有一个关于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()
答案 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的本地)的范围有关,但数据本身在您的程序中是有效的。