C:函数结束后丢失char**的内容[重复]

Posted

技术标签:

【中文标题】C:函数结束后丢失char**的内容[重复]【英文标题】:C: Losing content of char** after end of function [duplicate] 【发布时间】:2014-04-04 23:46:13 【问题描述】:

我有一个无法解决的问题。我将一个字符串拆分为子字符串并将这些子字符串放入一个数组中。一切都很好,直到搜索功能结束。 strtok 函数生成完美的子字符串,然后将所有内容都很好地放入数组中,但是当函数结束时,数组会丢失所有内容。我尝试了很多不同的东西,但似乎没有任何效果。我希望 words 数组在搜索功能结束并返回 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;

【问题讨论】:

请用适当的缩进格式化您的代码。 您不会为单独的单词复制数据,而只是将指针保存到现有数据拆分的地方。这意味着当您的源字符串超出范围时,这些指针将停止有效,此时数据可能会被覆盖等。这可能是您的代码中发生的事情吗? @Rup 所以你说而不是 words[n_spaces-1] = p 我必须为每个 words[n_spaces-1] 进行 malloc,然后 strcpy p 到 words[n_space-1]? 如果这实际上是您的问题,是的,尽管使用 strdup(argument)strtok 复制会更简单。 (之后free 也更简单。) C++ realloc 使用 NULL 指针; C stdlib 可能不会。尝试将单词初始化为 malloc(1) 而不是 NULL 【参考方案1】:

我猜你希望main 中的words 指向一个指向分隔符所在位置的指针数组。需要将变量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 中的逻辑,所以你可能还没有完成调试。

【讨论】:

嘿@Lencho Reyes 感谢您帮助我。我想到了。我不得不在主要使用 &words 但 (*words)[n_spaces-1] = p 不起作用。我不得不使用 malloc 和 strcpy 将 p 指向的字符串复制到单词数组中 可能是我误解了你的初衷。您介意发布对您有用的答案吗?这样,将来发现问题的任何人都会看到它是如何完成的。【参考方案2】:

我做错了几件事。首先在主函数中,当我调用搜索函数时,我必须传递数组的地址(&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, "+");
   


【讨论】:

以上是关于C:函数结束后丢失char**的内容[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++访问类内容器的开始()/结束()方法[重复]

在c ++ 11中将std :: string转换为char * [重复]

为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]

这是正确使用new和delete - c ++ [重复]

C语言试题二十六之请编写一个函数function(char *s),该函数的功反转字符串中的内容。

C语言试题二十六之请编写一个函数function(char *s),该函数的功反转字符串中的内容。