C静态变量问题

时间:2010-09-13 05:20:25

标签: c

帮助我,大师

/*
 * In this function, I want the static variable position to point to next element
 * of the str, every time I call this function.
 */
void function(char *str){

   static char *position = str;

   /* Do something here to this position */

   position += 1;
 }

这个程序的目的是做字符串替换,每次我替换str的模式我必须让静态位置变量指向str的新位置,然后我将每个东西复制到另一个新的串。

问题是,编译器一直告诉我“初始化元素不是常量”,我该如何解决这个问题?

6 个答案:

答案 0 :(得分:9)

你的函数中不能有一个静态变量指向str的下一个元素,因为position是一个初始化一次的全局变量,str可能有每次调用函数时都会有不同的值。

这里需要的是一个迭代str

的循环
void func1(char *str) {
    char *p;
    for (p = str; /* some condition here */; ++p) {
        /* Do something here to this position */
    }
}

在此函数外部有一个循环,并且每次迭代都会将str递增1。

void func1(char *str) {
    /* Do something here to this position */
}

void func2() {
    char *str = ...;
    ...
    char *p;
    for (p = str; /* some condition here */; ++p) {
        func1(p);
    }
}

当然,您可以首先将静态初始化为NULL并使用它来检查您是否开始迭代str,但这样的风格很差:太有状态且容易出错,不可重入而不是线程-safe。

答案 1 :(得分:7)

你需要做的是找到一些方法来决定你是否在字符串的开头,在这种情况下你重置position,或者不重置,在这种情况下你增加它:

/*
 * In this function, I want the static variable position to point to next element
 * of the str, every time I call this function.
 */
void function(char *str){

   static char *position;

   if (str) {
       position = str;
   } else {
       /* Do something here to this position */
       position += 1;
   }
 }

现在当strNULL时,该函数假定您继续使用与之前相同的字符串,并且当它不是NULL时,它假定您正在使用新的字符串。

答案 2 :(得分:5)

这不是C的做事方式 - 它不是重新开始的 - 但如果你绝对必须:

/*
 * In this function, I want the static variable position to point to next element
 * of the str, every time I call this function.
 */
bool function(char *str){

   static char *last_str;
   static char *position;

   if (str != last_str)
       last_str = position = str;

   /* Do something here to this position */

   if (*position != '\0')
       ++position;
   else
       last_str = NULL;

   return *position != '\0';
 }

然后您可以执行以下操作:

while (more) {
   // do something
   more = function(string);
}

答案 3 :(得分:1)

static char *position = str;

此错误背后的真正原因是,由于position是一个全局变量,因此只能使用编译时常量进行初始化。如果你尝试

,你会得到同样的错误
#include <stdio.h>
int j = 9;
static int k = j + 3; /* Error */
int main(){}

jstr都不是编译时常量,因此错误。

答案 4 :(得分:1)

正如其他人所提到的,在这里使用static变量是一个坏主意。我会详细说明错误:

在C中,具有静态存储持续时间的变量(全局变量和static变量)在程序启动之前初始化。因此,这需要提前知道初始值,并且必须是编译时常量。

在C ++中有点不同,也许这就是你期望的行为。具有静态存储持续时间的变量可以动态初始化。对于全局变量,这意味着在程序启动期间以某种未指定的顺序;对于函数中的static变量,这意味着它们在首次执行函数时被初始化。

答案 5 :(得分:1)

void func1();

char str[10] = "good";

int main()
{
   func1();
   return 0;    
}

void func1()
{
   static char *pos = &str[0];

   pos++;

   (pos) ? printf("%s\n",pos) : 0;  
}

这个程序会做。我在全局区域中使用ReadWrite区域编写了字符串,该区域是全局初始化区域,并在函数内部分配字符串的起始地址。首先打印“ood”,第二次打印“od”......