C库如何存储状态变量?

时间:2014-12-18 20:24:54

标签: c variables libraries

我已经在C中开发了一段时间,来自面向对象的语言,如C ++和Java,在使用fread()strtok()等标准库函数时,我开始怀疑:这些函数如何存储与其状态相关的变量?

例如,strtok()对后续调用的行为有所不同,fread()会跟踪您在文件中的位置。这些信息必须存储在某个地方,并且在面向对象的语言中有一些范围构造,例如privateprotected来保护这些值免受不必要的修改,但据我所知,C没有这些

那么,他们如何安全存储?或者它们实际上是全球性的并且可以在任何地方修改?当我编写带有需要存储类似状态信息的实用程序函数的头文件时,问题就产生了。在C中做这种事情的“正确”方法是什么,以及如何在现有的库中处理它?<​​/ p>

2 个答案:

答案 0 :(得分:8)

在fread()的情况下,状态存储在FILE结构中。该结构是由fopen()分配的资源,它返回指向它的指针,并将该指针传递给每个文件操作调用。调用fclose()时将释放资源。 FILE资源可以从静态池分配,也可以从堆中动态分配 - 这取决于实现。例如:

RESOURCE* getResource()
{
    return malloc( sizeof(RESOURCE) ) ; 
}

int useResource( RESOURCE* r )
{
   return r.index++ ;
}

void releaseResource( RESOURCE* r )
{
   free( r ) ;
}
另一方面,

strtok()包含一个内部静态指针,该字符串在传递字符串时初始化,并在传递空指针时用作起始点。

例如:

int getState()
{
    static int state = 0 ;
    return state++ ;
}

int main()
{
    int s ;

    do
    {
        s = getState() ;
        printf( "state = %d\n", s ;

    } while( s < 10 ) ;
}

答案 1 :(得分:7)

这些调用使用static个变量。本地静态变量在函数调用之间保留其值。全局静态变量或函数只能由同一文件中声明的其他函数访问。