使用read系统调用读取时报segmentation fault如何解决?
段错误触发原因
你遇到的崩溃核心原因是栈结构指针未分配合法内存就直接访问:
- 代码里
struct Stack * st;仅声明了一个栈类型的指针变量,此时这个指针指向内存的随机地址,没有对应任何程序可读写的合法内存空间 - 后续执行
st -> top = -1;相当于直接往随机内存地址写入数据,触发操作系统的内存访问保护,直接抛出段错误,实际崩溃位置远早于你标注的if (ch == '\n')行。
修复方案
有两种简单的修复方式可选:
方案1:栈上直接分配结构体实例
不需要使用指针,直接定义结构体变量即可:
struct Stack st; st.top = -1; // 后续调用push时传结构体地址即可:push(&st, ch);
方案2:给指针动态分配堆内存
如果必须使用指针,可以先通过malloc申请对应大小的内存,用完记得释放:
#include <stdlib.h> // ...... struct Stack * st = malloc(sizeof(struct Stack)); if (st == NULL) { // 内存申请失败直接退出即可 return 1; } st -> top = -1; // 程序结束前释放内存 free(st);
其他注意事项
- 你用到的
read是POSIX标准系统调用,需要引入头文件<unistd.h>才能正常编译 - 要保证
MAX宏的数值足够容纳所有输入内容,否则往a数组写数据时会出现越界,也会触发段错误 - 要实现逆序打印所有行的需求,除了存储字符外还需要额外记录每一行的起始位置/长度,否则逆序输出时无法正确拆分出行
内容的提问来源于stack exchange,提问作者AshGi
相关产品推荐
相关产品推荐

