c++ - 段错误 : Address out of bounds for a pointer in C

标签 c++ c segmentation-fault

我正在尝试构建和运行一些由其他人编写的复杂代码,我不知道他们是谁,也无法请求他们提供帮助。该代码读取一个 bpf(脑电势文件)并将其转换为可读的 ascii 格式。它有3个C文件,2个对应的头文件。我通过微小的更改成功构建了它,但是现在它崩溃了 有段错误。

我将问题缩小到 FindSectionEnd()(在 ReadBPFHeader.c 中),发现错误发生在调用 sscanfLine()(在文件 sscanfLine.c 中)时(两者的代码如下)。

ui1 被定义为无符号字符。 si1 定义为 char。

就在从 sscanfLine() 返回之前,dp 指向的地址是 0x7e5191,或者类似的以 191 结尾的地址。但是,在返回到 FindSectionEnd() 时,dp 指向 0x20303035,它说“地址 0x20303035 超出范围” ',然后在 strstr() 处导致错误。在故障发生之前,FindSectionEnd() 中的循环可以毫无问题地运行 14 次迭代。我不知道出了什么问题。我真的希望我在这里提供的信息是足够的。

ui1 *FindSectionEnd(ui1 *dp)
{
    si1 Line[256], String[256];
    int cnt=0;
    while (sscanfLine(dp, Line) != EOF){
        dp = (ui1 *)strstr(dp, Line);
        dp+= strlen(Line);
        sscanf(Line,"%s",String);
        if(SectionEnd(String))
            return(dp);
    }
    return(NULL);
}

si1 *sscanfLine(ui1 *dp, si1 *s)
{
    int i = 0;

    *s = NULL;
    int cnt = 0;
    while (sscanf(dp, "%c", s + i) != EOF){
        cnt++;

        dp++;
        if(*(s + i) == '\n') {
            *(s + i + 1) = '\0';
            return s;
        }
        ++i;
    }
    *(s + i) = '\0';
    return s;
}

最佳答案

sscanfLine 函数不考虑传入缓冲区的大小,如果它在前 256 个字节内没有找到 '\n',很高兴丢弃 Line 数组旁边的堆栈。

您可以通过增大 Line 来解决这个问题。

如果您要改进代码,您应该将缓冲区大小传递给 sscanfLine 并使其在达到计数时停止,即使未找到换行符也是如此。当你这样做时,不是返回调用者已经拥有的 s,而是让 sscanfLine 返回 dp 的新值,这将调用者无需使用 strstrstrlen

关于c++ - 段错误 : Address out of bounds for a pointer in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344829/

相关文章:

c++ - 在控制台日志中保留巨大的数字

c++ - 关于重构的书的建议?

c++ - 在卷 DICOM 图像上设置 vtkLookupTable

C 指针数组

c - 使用多线程的段错误

c++ - 从 shared_ptr 获取原始 ptr 并再次共享

c - ioremap_page_range 和 vmap_page_range 的区别

c - 神奇地撤消 fprintf 格式错误

c - OpenCL clEnqueueReadBuffer 段错误随机

c - 将参数传递给函数时 C 中的段错误