C中的外部和静态指针

时间:2009-08-17 07:01:05

标签: c pointers static extern

你可以使用静态和外部指针?如果他们存在

5 个答案:

答案 0 :(得分:11)

要回答关于何时可以使用它们的问题,请举几个简单的例子:

静态指针可用于实现一个总是向程序返回相同缓冲区的函数,在第一次调用它时分配它:

char * GetBuffer() {
   static char * buff = 0;
   if ( buff == 0 ) {
       buff = malloc( BUFSIZE );
   }
   return buff;
}

extern(即全局)指针可用于允许其他编译单元访问main的参数:

extern int ArgC = 0;
extern char ** ArgV = 0;

int main( int argc, char ** argv ) {
   ArgC = argc;
   ArgV = argv;
   ...
}

答案 1 :(得分:8)

简短回答:它们不存在。 C99 6.7.1说“最多可以在声明中的声明说明符中给出一个存储类说明符”。 externstatic都是存储类说明符。

答案 2 :(得分:3)

假设我有一个指针,我想让全局可用于多个翻译单元。我想在一个地方(foo.c)定义,但在其他翻译单元中允许多个声明。 “extern”关键字告诉编译器这不是对象的定义声明;实际定义将出现在其他地方。它只是使对象名可用于链接器。编译和链接代码时,所有不同的翻译单元将按该名称引用同一对象。

假设我还有一个指针,我想让全局可用于单个源文件中的函数,但不能让其他翻译单元看到它。我可以使用“static”关键字来指示对象的名称不会导出到链接器。

假设我还有一个指针,我只想在一个函数中使用,但在函数调用之间保留了该指针的值。我可以再次使用“static”关键字来表示该对象具有静态范围;它的内存将在程序启动时分配,直到程序结束才会释放,因此对象的值将在函数调用之间保留。

/** 
 * foo.h
 */
#ifndef FOO_H
#define FOO_H

/**
 * Non-defining declaration of aGlobalPointer; makes the name available
 * to other translation units, but does not allocate the pointer object
 * itself.
 */
extern int *aGlobalPointer;

/**
 * A function that uses all three pointers (extern on a function 
 * declaration serves roughly the same purpose as on a variable declaration)
 */
extern void demoPointers(void);
...
#endif

/**
 * foo.c
 */
#include "foo.h"

/**
 * Defining declaration for aGlobalPointer.  Since the declaration 
 * appears at file scope (outside of any function) it will have static 
 * extent (memory for it will be allocated at program start and released 
 * at program end), and the name will be exported to the linker.
 */
int *aGlobalPointer;

/**
 * Defining declaration for aLocalPointer.  Like aGlobalPointer, it has 
 * static extent, but the presence of the "static" keyword prevents 
 * the name from being exported to the linker.  
 */
static int *aLocalPointer;

void demoPointers(void)
{
  /**
   * The static keyword indicates that aReallyLocalPointer has static extent, 
   * so the memory for it will not be released when the function exits,
   * even though it is not accessible outside of this function definition
   * (at least not by name)
   */
  static int *aReallyLocalPointer;
}

答案 3 :(得分:2)

请参阅How to correctly use the extern keyword in C

Internal static variables in C, would you use them?

本质上,当在函数中使用时,“静态”(在标准C中)允许变量不被消除,因为一旦函数结束通常就会消失(即,每次调用函数时它都保留其旧值)。 “Extern”扩展了变量的范围,因此可以在其他文件中使用(即,它使其成为全局变量)。

答案 4 :(得分:2)

简短的回答。 静态是持久性的,因此如果在函数中声明它,当再次调用该函数时,该值与上次相同。如果您全局声明它,那么它只是该文件中的全局。

Extern表示它在全局声明,但在不同的文件中。 (它基本上意味着这个变量确实存在,这就是它所定义的)。