静态变量忽略重新分配

时间:2014-07-28 05:51:58

标签: c static assignment-operator

我怀疑这与范围有关,但是请使用此代码生成带有初始空格和后续逗号的列表,如Peter van der Linden的 Expert C Programming, Deep C Secrets 所示:

void generate_initializer(char * string) {
    static char separator = ' ';
    printf("%c %s\n", separator, string);
    separator = ',';
}

为什么separator在通过指令static char separator = ' ';时未被重新分配?我理解'static'告诉编译器为separator分配空间,扩展程序的长度,并使其范围仅限generate_initializer(),但我认为代码不会忽略这样的赋值操作,并始终将separator重新分配为空格。

3 个答案:

答案 0 :(得分:1)

该行

static char separator = ' ';

只执行一次 - 初始化separator时。

如果要重置其值,则必须使用:

void generate_initializer(char * string) {
    static char separator = ' ';
    separator = ' ';
    printf("%c %s\n", separator, string);
    separator = ',';
}

答案 1 :(得分:1)

static变量在编译时分配和初始化,而不是在运行时。为什么?我不知道,让我们在逻辑上分解它。我们可以想象四种类型的局部变量:

  1. 在运行时分配和初始化 - 即正常的局部变量
  2. 在编译时分配和初始化 - 即静态变量
  3. 在编译时分配并且(重新)在运行时初始化 - 即,你在这里显然期望的那种变量
  4. 在运行时分配并在编译时初始化 - 即,不可能
  5. 好的,(4)是不可能的,(3)......(3)的重点是什么?我无法想象任何一点。因此,它的实施方式是有道理的。

    PS那个功能虽然很傻!您只能在一个字符串上使用它。然后你就完成了。

答案 2 :(得分:0)

对于

static char separator = ' '; // Static keyword extend the lifetime of a variable to the lifetime of the programme; 

如果在函数作用域内声明的变量是static,那么它使它不是自动变量而是全局分配的变量。因此,变量将在函数退出后存在,因此将在函数的调用中保持其值,并且即使在函数退出之后,对它的任何引用(指针)也是有效的。所以它只初始化了一次。