K&R fopen 和 fillbuf 中的 C 段错误

2023-12-13

我对C很陌生。我在学习K&R最后一章时遇到了一个问题。

我正在尝试实施fopen() and fillbuf()通过使用系统调用来实现功能,open and read.

我完全复制了书中的源代码,但编译后反复出现分段错误。

    fp->fd = fd;
    fp->cnt = 0;
    fp->base = NULL;
    fp->flag = (*mode=='r')? _READ : _WRITE;

为什么会出现错误?这是我的完整代码。

#include<fcntl.h>
#include<unistd.h>
#include<stdlib.h>
#define PERM 0644
#define EOF (-1)
#define BUFSIZE 1024
#define OPEN_MAX 20

typedef struct _iobuf{
    int cnt;
    char *ptr;
    char *base;
    int flag;
    int fd;
} myFILE;

enum _flags {
    _READ   = 01,
    _WRITE  = 02,
    _UNBUF  = 04,
    _EOF    = 010,
    _ERR    = 020
};

myFILE _iob[OPEN_MAX]={
    {0, (char *) 0, (char *) 0, _READ, 0 },
    {0, (char *) 0, (char *) 0, _WRITE, 1 },
    {0, (char *) 0, (char *) 0, _WRITE | _UNBUF, 2 }
};

#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])

#define getc(p)     ( --(p)->cnt>=0 ? (unsigned char) *(p)->ptr++ : _fillbuf(p) )

int _fillbuf(myFILE *fp)
{
    int bufsize;

    if((fp->flag & (_READ|_EOF|_ERR))!=_READ)
        return EOF;

    bufsize=(fp->flag & _UNBUF)? 1 : BUFSIZE;

    if(fp->base==NULL)
        if((fp->base=(char *)malloc(bufsize))==NULL)
            return EOF;

    fp->ptr=fp->base; 
    fp->cnt=read(fp->fd, fp->ptr, bufsize);

    if(--fp->cnt<0){
        if(fp->cnt == -1)
            fp->flag |= _EOF;
        else
            fp->flag |= _ERR;
        return EOF;
    }
    return (unsigned char) *fp->ptr++;  
}

myFILE *myfopen(char *name, char *mode)
{
    int fd;
    myFILE *fp;

    if(*mode!='r' && *mode!='w' && *mode!='a')
          return NULL;
    for(fp=_iob; fp<_iob+OPEN_MAX; fp++)
        if((fp->flag & (_READ | _WRITE))==0)
            break;

    if(fp>=_iob+OPEN_MAX)
        return NULL;

    if(*mode=='w')
         fd=creat(name, PERM);
    else if(*mode=='a'){
        if((fd=open(name, O_WRONLY, 0))==-1)
            fd=creat(name, PERM);   
        lseek(fd, 0L, 2);
    } else
        fd=open(name, O_RDONLY, 0);

    if(fd==-1)
        return NULL;

    fp->fd = fd;
    fp->cnt = 0;
    fp->base = NULL;
    fp->flag = (*mode=='r')? _READ : _WRITE;

        return fp;    
    } 

int main(int argc, char *argv[])
{
myFILE *fp;
int c;

if((fp=myfopen(argv[1], "r"))!=NULL)
    write(1, "opened\n", sizeof("opened\n"));

    while((c=getc(fp))!=EOF)
        write(1, &c, sizeof(c));

    return 0;
}

编辑:请参阅乔纳森·莱弗勒的回答。它更准确并提供更好的诊断。我的答案有效,但有更好的方法来做事。

我看到了问题所在。

myFILE *fp;

if(*mode!='r' && *mode!='w' && *mode!='a')
      return NULL;
for(fp=_iob; fp<_iob+OPEN_MAX; fp++)
    if((fp->flag & (_READ | _WRITE))==0) // marked line
        break;

当您到达marked line,您尝试取消引用fp指针。因为它(可能,但不一定)初始化为零(但我应该说NULL),您正在取消引用空指针。繁荣。段错误。

这是您需要更改的内容。

myFILE *fp = (myFILE *)malloc(sizeof(myFILE));

务必#include <malloc.h>使用malloc。

还有你的close函数应该稍后free() your myFILE以防止内存泄漏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K&R fopen 和 fillbuf 中的 C 段错误 的相关文章

  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • Swift 2 tableview滚动更改数据

    我无法正确加载数据 顶部的单元格加载良好 然后当我向下滚动并向上滚动时 必须显示电话号码的曾经黑色的图标会亮起 当触摸它们时 它们会拨打随机号码 这很奇怪 因为具有电话号码的其他单元格不会仅更改留下等于 的单元格 这是来自 ViewCont
  • Selenium 的应用程序没有响应 - 不显示进度条,并且在任务完成之前不在控制台中发出文本

    使用 PyQt5 和 selenium 时 窗口标题显示为 无响应 脚本执行完成后将显示进度条和控制台发出流 需要帮助来解决这个问题 from selenium import webdriver from selenium common e
  • 是否可以使用javascript生成文件并将其发送到服务器?

    是否可以使用javascript生成文件并将其发送到服务器 我的网页中有一个部分 用户可以在其中修改其页面的样式 并且我想在将其发送到服务器之前生成具有该样式配置的 css 文件 这可能吗 谢谢 var blob new Blob css
  • 从根为数组的 jsonpath 获取元素值

    我有一个 JSON 响应 其根为 1 个或多个对象的数组 我想提取每个对象中的一个元素的值 这是 JSON 示例 od pair 7015400 8727100 buckets bucket C00 original 2 available
  • 运行 git init 两次是否会初始化存储库或重新初始化现有存储库?

    当您发出命令时 现有的 git 存储库会发生什么git init again 我创建了一个存储库git init 创建文件 添加 提交 检查状态 没有要提交的内容 然后创建另一个文件 检查状态 我可以看到它没有按预期被跟踪 然后 错误地说
  • 为什么当我创建新存储库时 github 显示灰色文件夹?

    git命令 git init git add git commit m project git remote add origin https github com git push u origin master 灰色文件夹 github
  • MySql 使用哪种数据结构? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 MySql 使用哪种数据结构 可能很多 但从 B 树开始
  • 页面刷新后如何保留div内容

    我正在使用 Jquery 创建一个动态 div 并且尝试缓存它 以便在页面刷新后将其取回 请帮助了解如何实现这一点 粘贴下面的代码
  • 增加PHP中的max_execution_time?

    我正在尝试将大文件上传到我的服务器 我的服务器支持post max size192mb 和max execution time600 秒 当我上传 100mb 文件时 执行将在 600 秒后停止 因此文件不会上传到服务器 我怎样才能增加ma
  • 如何获取 geom_segment 显示图例

    我有下面的图 有 2 段 如何为线段添加图例 理想情况下 最终结果有 2 个图例 其中之一就是当前的 点图例 另一个图例是单个图例 带有红色虚线标记为 段图例 这是代码 set seed 11 x rnorm 100 y rnorm 100
  • 如何有效地知道字符中第一个(左 -> 右)“1”位的位置[重复]

    这个问题在这里已经有答案了 正如标题所说 我有一个字符 例如00101011 我如何知道其中第一个 1 位的位置 在本例中 它是 6 如果我们认为最右边的位置是 0 则它是 5 我知道 for 循环移位会有所帮助 但是有更有效的方法吗 有一
  • 替换字符串中的变量占位符

    我的字符串看起来像这样 您可以使用促销直到 开始日期 30 我需要更换 Start Date 30 带有实际日期的占位符 即销售的开始日期加上 30 天 或任何其他数字 Start Date 也可能单独出现而不添加编号 此外 占位符内的任何
  • SASS 变量和继承

    假设我有两个几乎相同的 HTML 结构 但具有不同的class名称 它们仅存在几个变量不同 例如width and height 通过使用 SASS SCSS 变量 我想我可以做这样的事情 widget a width 50px widge
  • iOS 6 Facebook 登录不刷新访问令牌

    我正在阅读的任何内容 许多 FB 开发文章和 SO 问题 都没有帮助 所以我想我应该在这里发帖 我正在尝试让这一切与 iOS 6 和 Facebook SDK 3 1 1 一起使用 我有一个非常基本的设置 我的 iOS 应用程序通过 Fac
  • 请帮我找出这个网络代理代码有什么问题

    我想编写一个网络代理来练习 这是我到目前为止的代码 returns a map that contains the port and the host def parseHostAndPort String data def objMap
  • 加快 Gatsby 性能

    我在工作中接到了一项提高项目绩效的任务 目前 Google Lighthouse 分数有所波动 但总体而言 分数并不是那么好 因此我们正在尝试找出如何提高其性能 以便能够向我们的领导者炫耀 我们的项目将整个 Gatsby 站点作为单个 Ja
  • PHP 中如何将十六进制转换为二进制?

    我正在尝试发送0x01十六进制作为字节使用socket write socket XXXX 1 功能 有部分文档 如果是 服务器将回复模块 0x01 如果不是 重播 0x00 服务器必须发送答案 1 字节十六进制格式 有多种选择 当使用pa
  • 画布动画中的闪烁图像

    window requestAnimFrame function callback return window requestAnimationFrame window webkitRequestAnimationFrame window
  • 在ipython中调用pylab.savefig而不显示

    我需要在文件中创建一个图形 而不在 IPython 笔记本中显示它 我不清楚之间的相互作用IPython and matplotlib pylab在这方面 但是 当我打电话时pylab savefig test png 除了保存在中之外 还
  • K&R fopen 和 fillbuf 中的 C 段错误

    我对C很陌生 我在学习K R最后一章时遇到了一个问题 我正在尝试实施fopen and fillbuf 通过使用系统调用来实现功能 open and read 我完全复制了书中的源代码 但编译后反复出现分段错误 fp gt fd fd fp