// Returns a list of topic numbers found on the page
vector<string> findTopics(char* rData, int rDataLen) {
    pcre *re;
    const char *error;
    int erroffset;
    re = pcre_compile(
        "topic/([0-9]+)",   /* the pattern */
        0,          /* default options */
        &error,         /* for error message */
        &erroffset,     /* for error offset */
        NULL);          /* use default character tables */

    if(re == NULL) {
    printf("Couldn't compile regex (%s)", error);
        //  exit(-1):
    }

    int regOf[2];
    vector<string> topics;

    char *topic;
    int offset = 0;
    int rc = 1;
    // Basically a preg_match_all()
    while(true) {
        rc = pcre_exec(re, NULL, rData, rDataLen, offset, 0, regOf, sizeof(regOf));
        if (rc < 2) {
            break;
        }

        topic = new char[8];
        sprintf(topic, "%.*s\n", regOf[2*1+1] - regOf[2*1], rData + regOf[2*1]);

        topics.push_back(topic);
        offset = regOf[1];
    }

    pcre_free(re);

    return topics;
}

该函数应该在topic/[0-9]+中获取我解析的特定内容中找到的“主题”列表(匹配rData),并且几乎可以正常工作。 topics充满了应该的主题编号。

当我在Visual Studio中调试它时,在函数结束(返回)后立即得到以下错误消息:运行时检查失败#2-变量'regOf'周围的堆栈已损坏。

我无法弄清楚我在做什么错,想知道是否有人可以指出我正确的方向。

最佳答案

您使用2个元素定义regOf。然后,您将sizeof(regOf)传递给pcre_exec函数,但是该函数询问数组中有多少个项目,而不是大小是多少字节。这样,该函数认为它有8个插槽可填充,只有2个,因此可以耗尽数组末尾并破坏内存。

10-08 09:25