我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]相关的知识,希望对你有一定的参考价值。
你好我在munmap_chunk(): invalid pointer
上获得regfree(®exCompiled);
regexCompiled已分配。
问题是只有在找到匹配时才会发生这种情况,否则它会正常工作
一步之后:
这是功能代码:
char * WebServer::get_db_query(char * line) {
const char * regex = "<sql\s+db=(.+?)\s+query=(.+;)\s*\\>";
size_t maxGroups = 3;
char * ret = (char * ) malloc(sizeof(char));
regex_t regexCompiled;
regmatch_t groupArray[maxGroups];
if (regcomp( & regexCompiled, regex, REG_EXTENDED)) {
printf("Could not compile regular expression.
");
fflush(stdout);
return NULL;
};
if (!regexec( & regexCompiled, line, maxGroups, groupArray, 0)) {
char copy[strlen(line) + 1];
strcpy(copy, line);
copy[groupArray[1].rm_eo] = ' ';
copy[groupArray[2].rm_eo] = ' ';
matched = true;
sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);
printf("Match %s
",
copy+ groupArray[1].rm_so);
printf("Match %s
",
copy+ groupArray[2].rm_so);
fflush(stdout);
}
regfree( & regexCompiled);
return ret;
}
答案
使用reg*()
函数是正确的。
通过释放regex_t
程序崩溃,这通常意味着内存管理之前已经搞砸了。
这就是您展示的代码中发生的事情:
这条线
char * ret = (char * ) malloc(sizeof(char));
恰好分配一个char
,这使得ret
只指向一个空字符串。
然后在这里
sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);
代码复制大量数据为ret
点。
根据需要为ret
分配尽可能多的内存。肯定只有一个char
很少。
另一答案
使用char * ret = (char * ) malloc(sizeof(char));
,您只需分配一个字符。
当你以后再做sprintf(ret, "%s;%s", ..
时,你会超越这一个字符,所以你会破坏记忆。
然后在任何以后的时刻,当堆检测到它已被破坏时,您可能会遇到问题。
分配多个char。
以上是关于我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在基数排序中,我得到 munmap_chunk(): invalid pointer 和 Aborted (core dumped)。为啥?
C 语言错误 munmap_chunk(): invalid pointer Aborted (core dumped)