gpt4 book ai didi

c - regexec 损坏 const char * 参数

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

我有这个代码:

char *buffer = calloc(400, sizeof(char));
// buffer gets assigned a string through fgets
if (!regexec(&line_regex, buffer, 400, regmatch_t_var, 0))
// whatever

当条件为假时,字符串 buffer 保持原样(根据 gdb)。
但是当条件为真时,字符串 buffer 会损坏(gdb 说 0xffffffffffffffffff>)。

这真的很奇怪,因为我记得,地址 0xfffffffffffffffff 是内存最低部分的地址,而堆 (calloc) 在最高部分初始化字节内存。

谁能解释一下这是怎么回事?

编辑:

下面是一个有助于说明的示例。

首先,创建一个名为 h 的文件,如下所示:ps aux > h

其次,编译这个:

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

int main(void)
{
FILE *out = fopen("h", "r");

regex_t line_regex;
regcomp(&line_regex, "(\\w|\\+)+\\s+([0-9]+).+ [0-9]+:[0-9]+ (.+)$", REG_EXTENDED);

char *buf = calloc(400, sizeof(char));
regmatch_t pmatch[5];

/* SegFault when the loop continues after passing the condition */
while (fgets(buf, 400, out) != NULL)
if (!regexec(&line_regex, buf, 400, pmatch, 0))
;
fclose(out);
free(buf);
return 0;
}

... 使用 gcc -g

第三,用gdb检查代码,你会发现问题出在哪里。

最佳答案

错误在于您调用 regexec 的方式。你有

if (!regexec(&line_regex, buf, 400, pmatch, 0))
^^^ this is wrong

regexec 不需要你告诉它要搜索的字符串的长度;它为此使用 NUL 终止符。第三个参数应该是 pmatch 数组中的条目数。如果我将该参数更改为 5,与 pmatch 的声明一致>,您的程序执行成功。

您可能想知道为什么必须正确设置此值,考虑到您的实际正则表达式中只有三组捕获括号。事情是, regexec 被指定为将所有不匹配的捕获组的 pmatch 条目设置为 { -1, -1 } ...显然此实现通过提前用 { -1, -1 } 填充整个 pmatch 数组(由其第三个参数确定大小)来实现。因此,它写入已声明数组的末尾并破坏 buf 指针。

关于c - regexec 损坏 const char * 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26932909/

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