C:功能结束后丢失char **的内容

时间:2014-03-03 19:03:36

标签: c pointers char

我遇到了一个无法解决的问题。我在子串中拆分了一个字符串,并将这些子串放在一个数组中。一切顺利,直到搜索功能结束。 strtok函数生成完美的子串,然后一切都很好地放在数组中,但是当函数结束时,数组丢失了所有的内容。我尝试过很多不同的东西,但似乎没什么用。当搜索功能结束并返回main时,我希望单词数组保留其内容。

int main(void)
{
    char** words=NULL;
    char argument[26] = "just+an+example";

    search(argument, words);
}

search(char* argument, char** words)
{
    char* p = strtok (argument, "+");
    int n_spaces = 0;

    while (p) 
    {
        words = realloc(words, sizeof(char*)* ++n_spaces);

        if (words == NULL)
            exit(-1); // memory allocation failed

        words[n_spaces-1] = p;
        p = strtok(NULL, "+");
    }

    // realloc one extra element for the last NULL 
    words = realloc(words, sizeof(char*)* (n_spaces+1));
    words[n_spaces] = 0;
}

2 个答案:

答案 0 :(得分:1)

我猜你希望words中的main指向一个指向分隔符所在位置的指针数组。您需要将变量words的地址传递给search,并在search内传递变量words指向的内存。

试试这个:

int main(void)
{
   char** words = NULL;
   char argument[26] = "just+an+example";

   search(argument, &words);
}

search(char* argument, char*** words)
{
    char* p = strtok (argument, "+");
    int n_spaces = 0;

    while (p) 
    {
       *words = realloc(*words, sizeof(char*) ++n_spaces);

       if (*words == NULL)
            exit(-1); // memory allocation failed

        (*words)[n_spaces-1] = p;
        p = strtok(NULL, "+");
    }

    // realloc one extra element for the last NULL 
    *words = realloc(words, sizeof(char*)* (n_spaces+1));
    (*words)[n_spaces] = 0;
}

我根本没有检查search中的逻辑,所以你可能还没有完成调试。

答案 1 :(得分:0)

我做错了几件事。首先在主函数中,当我调用搜索函数时,我必须通过我的数组的地址(& words)。我的第二个错误是不是复制子串本身而是复制了指向子串的指针。在函数结束时,这些指针被释放,因此我的数组在函数结束时丢失了他的内容。为了解决这个问题,每次我想将一个新字符串复制到我的数组并使用strcpy复制指针指向我的数组的字符串时,我必须使用malloc。

int main(void)
{
   char** words = NULL;
   char argument[26] = "just+an+example";

   search(argument, &words);
}

search(char* argument, char*** words)
{
   char* p = strtok (argument, "+");
   int n_spaces = 0;

   while (p) 
   {
      *words = realloc(*words, sizeof(char*) ++n_spaces);

      if (*words == NULL)
        exit(-1); // memory allocation failed

      (*words)[n_spaces - 1] = malloc(sizeof(char)* (strlen(p) + 1));

      strcpy((*words)[n_spaces - 1], p);

      p = strtok(NULL, "+");
   }

}