我正在尝试构建和运行一些由其他人编写的复杂代码,我不知道他们是谁,也无法请求他们提供帮助。该代码读取一个 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
的新值,这将调用者无需使用 strstr
和 strlen
。
关于c++ - 段错误 : Address out of bounds for a pointer in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344829/