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 ++ 11中将std :: string转换为char * [重复]
为啥 const char* 返回值丢失了两个字符?但是在返回之前打印正确的值[重复]