gpt4 book ai didi

C KERN_INVALID_ADDRESS 在 regnexec()

转载 作者:太空宇宙 更新时间:2023-11-04 07:28:40 24 4
gpt4 key购买 nike

我正在用 c 语言编写一个程序,该程序严重依赖于正则表达式,我执行它们的机制在 99% 的时间都有效,但它每隔一段时间就会让程序崩溃,我很困惑为什么会这样。

New_Sifter() 采用其正则表达式的字符串表示形式和采用数组或字符串并返回单个字符串的处理函数。

Sifter* New_Sifter(const char* exp, const char*(*func)(const char**, size_t)){
Sifter *sifter = malloc(sizeof(Sifter*));
sifter->strRegEx = exp;
if(regcomp(&(sifter->regEx), exp, REG_EXTENDED)){
printf("Could not compile regular expression\n");
exit(1);
}
sifter->Sift = &Base_;
sifter->Custom = func;
sifter->nGroups = sifter->regEx.re_nsub + 1;
sifter->captures = malloc(sifter->nGroups * sizeof(regmatch_t));
Register_Disposable(sifter->captures); //stores pointer in registry to be freed later
Register_Disposable(sifter); //stores pointer in registry to be freed later
return sifter;
}

const char* Base_(Sifter* self, const char* source){
if(regexec(&(self->regEx), source, self->nGroups, self->captures,
REG_EXTENDED) != 0){
printf("about to return null\n");
return NULL;
}
return self->Custom(
//Sift_() returns an array of the strings captured in the regexec
Sift_(source, self->captures, self->nGroups), self->nGroups);
}

当我运行它(并使用 gdb 调试一些)时,我有时会遇到的错误如下所示:

程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因:KERN_INVALID_ADDRESS 地址:0x00000000000000080x00007fff90d72b9f 在 tre_reset_last_matched_branches ()(gdb) BT

  • tre_reset_last_matched_branches () 中的 0x00007fff90d72b9f
  • tre_fill_pmatch () 中的 0x00007fff90d72a58
  • tre_match () 中的 0x00007fff90d72e56
  • regnexec () 中的 0x00007fff90d72d35
  • 0x00000001000030cf in Base_ (self=0x1001000e0, source=0x1000033ee "add 11111, 22222, 33333")

最佳答案

 Sifter *sifter = malloc(sizeof(Sifter*));

这一行有一个 * 太多了。您正在为指针分配空间,而不是为结构分配空间。从 sizeof 中取出 *。

关于C KERN_INVALID_ADDRESS 在 regnexec(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15936681/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com