段错误:C语言指针的地址越界
Segmentation fault : Address out of bounds for a pointer in C
我正试图构建和运行一些由别人写的复杂代码,我不知道他们是谁,也不能要求他们帮助。该代码读取bpf(大脑潜能文件)并将其转换为可读的ascii格式。它有3个C文件和2个相应的头文件。我让它成功地构建与微小的变化,但现在它崩溃了有分段错误。
我将问题缩小到FindSectionEnd()(在ReadBPFHeader.c中),并发现当sscanline()(在文件sscanline .c中)被调用时发生错误(两者的代码如下)。
ui1定义为unsigned char。Si1定义为char。
在从sscanline()返回之前,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) = ' ';
return s;
}
++i;
}
*(s + i) = ' ';
return s;
}
sscanfLine
函数不尊重传入的缓冲区的大小,如果在前256字节内没有找到'n'
,则愉快地将Line
数组旁边的堆栈丢弃。
你可以通过使Line
更大来解决这个问题。
如果你要改进代码,你应该将缓冲区大小传递给sscanfLine
,并使它在计数达到时停止,即使没有找到换行符。当您在这里时,而不是返回调用者已经拥有的s
,使sscanfLine
返回dp
的新值,这将使调用者无需使用strstr
和strlen
。
我的第一个猜测是,您的字符串不是null终止和strstr()分段错误,因为它读取超过数组的边界
相关文章:
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 与其他语言相比的 Ruby 和指针
- 指针的一系列指针:管理不同语言的字符串
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- 我可以使用功能指针在编程语言边界上调用函数
- std::shared_ptr语言 - 将共享指针作为参数传递的最佳做法
- 在 C 语言中使用 *&*&p 了解复杂的指针和地址运算符
- C/C++语言-指针和算术..异常代码:c0000005
- 指向未指定大小的数组的指针在C++"(*p)[]"非法,但在 C 语言中是合法的
- 在 C 语言中旋转图像对象和指针
- c语言中的远函数指针是什么,它的语法是什么
- C++:在 C 语言中传递指向模板类的指针
- C或c++语言中的数组实际上是指针吗?
- c语言中具有指针数组的结构体
- 如何在c语言中将void*转换为float**,将void指针转换为float指针
- 段错误:C语言指针的地址越界
- C语言结构和指针的难点
- 如何在Java编程语言中添加指针
- std::vector语言 - 错误:无法删除不是指针的对象
- 在 C 语言中将浮点指针重新转换为双指针的最有效方法是什么?