【问题标题】:How to clean a static return array of char*?如何清理 char* 的静态返回数组?
【发布时间】:2019-11-25 09:55:43
【问题描述】:

我想在使用后清理这个char* 的静态数组。我想从文件中读取并将通过 fgets() 获得的行拆分为单词数组,返回它并清理缓冲区(static char *words)。但这是我对 split() 的实现,我想知道静态 char* 字是否不会导致内存泄漏,因为我无法销毁它,因为我想在每次从文件中获取一行时调用它:

#define MAX_LENGTH 10000

char** split(char* string)
{
  static char* words[MAX_LENGTH / 2];
  static int   index     = 0;
  const char*  delimiter = " ";

  char* ptr = strtok(string, delimiter);

  while (ptr != NULL) 
  {
    words[index] = ptr;
    ptr          = strtok(NULL, delimiter);
    ++index;
  }

  index = 0;
  return words;
}

int main()
{
  char   line[]   = "yes you are good ";
  char **splitted = split(line);

  printf("%s\n", splitted[2]);
}

请问有什么办法吗?

【问题讨论】:

  • 函数中静态存储野兽的本质。您可以执行类似基于已知输入值触发替代行为的操作(即,调用方将NULL 发送为string 重置index 并擦除数组)。但这是一个掩盖真正问题的骇人听闻的黑客行为。这是一个糟糕的地方,首先使用静态数组。
  • 你为什么要把index设为静态?
  • 谢谢我没有注意到索引不应该是静态的。感谢更新
  • @WhozCraig ,我对你的解释有点模糊。你能举个例子吗?

标签: c


【解决方案1】:

您可以在重新使用之前在函数开头重置它。基本上,您正在清除当前通话中的先前条目。

char* *split(char *string){
        static char *words[MAX_LENGTH / 2];
        static int index = 0;

        //reset
        for (int i=0; i < sizeof(words)/sizeof(words[0]); i++) {
            words[i] = NULL;
        }

        const char *delimiter=" ";
        char *ptr = strtok(string,delimiter);
        while (ptr!=NULL)
        {
                words[index]= ptr;
                ptr=strtok(NULL,delimiter);
                ++index;
        }
        index=0;
        return words;
}

【讨论】:

    猜你喜欢
    • 2017-09-30
    • 2016-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多