尝试创建 100MB 缓冲区时出现分段错误

2024-04-02

我正在尝试将一个大的二进制文件写入 C++ 程序的缓冲区中。在尝试创建与文件读取大小相同的缓冲区后,GDB 总是会出现段错误。它要么在 fclose(pf)、倒带或 f(open) 上失败,这让我相信当我尝试创建缓冲区时出现了问题。我的代码段如下。

static int fileTransfer(struct mg_connection *conn, char * filename){

    FILE *fp = fopen(filename, "r"); 

    fseek(fp, 0, SEEK_END);
    int size = ftell(fp);

    char buf[size];

    fclose(fp); 

    // This is an attempt to stop a segment fault from rewind. 
    fp = fopen(filename, "r"); 

    conn->connection_param = (void *) fp;
    size_t n = 0;

    if(fp != NULL)
    {
        n = fread(buf, 1, sizeof(buf), fp);

        mg_send_data(conn, buf, n);

        if(n < sizeof(buf) || conn->wsbits != 0)
        {
            fclose(fp);
            conn->connection_param = NULL;
        }
    }

return 1;
}

我尝试将打印语句放入此代码中,但它们不会打印到控制台,因为它们在单独的线程中运行。有人可以给我一些关于为什么会发生此段错误的见解,或者一些关于如何使此代码更高效的建议。

我应该注意到,这段代码可以在 1 MB 和 10 MB 文件上正常工作,但不能在更大的文件上工作。


永远不要这样做:

int size = ftell(fp);

char buf[size];

您正在堆栈上创建大小,而不是堆上......堆栈上的 100MB 不起作用。

并且...大小必须是常量,而不是来自以下位置的数字ftell()。我什至不知道它是如何编译的......

你必须做的是使用分配内存malloc() or new操作员。

static int fileTransfer(struct mg_connection *conn, char * filename){

    FILE *fp = fopen(filename, "r"); 

    fseek(fp, 0, SEEK_END);
    int size = ftell(fp);

    char * buf = new char[size];  // fix also here!

    fclose(fp); 

    // This is an attempt to stop a segment fault from rewind. 
    fp = fopen(filename, "r"); 

    conn->connection_param = (void *) fp;
    size_t n = 0;

    if(fp != NULL)
    {
        n = fread(buf, 1, size, fp); // fix also here!

        mg_send_data(conn, buf, n);

        if(n < size || conn->wsbits != 0)
        {
            fclose(fp);
            conn->connection_param = NULL;
        }
    }

    delete [] buf; // and you have to deallocate your buffer

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

尝试创建 100MB 缓冲区时出现分段错误 的相关文章

  • 检查空参数的最佳方法(保护子句)

    例如 您通常不希望构造函数中的参数为空 因此看到类似的内容是很正常的 if someArg null throw new ArgumentNullException nameof someArg if otherArg null throw
  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 返回 int& 的函数[重复]

    这个问题在这里已经有答案了 我在网上查了一下发现一篇试图解释的文章std move和右值 http thbecker net articles rvalue references section 01 html并发现了一些我实在无法掌握的东
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • 指示泛型返回动态类型的对象

    这个问题是我原来问题的后续问题here https stackoverflow com questions 2541184 using a type object to create a generic 假设我有以下泛型类 简化 class
  • QThread - 使用槽 quit() 退出线程

    我想在线程完成运行时通知对象 但是 我无法让线程正确退出 我有以下代码 处理器 cpp thread new QThread tw new ThreadWorker connect tw SIGNAL updateStatus QStrin
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • C# 中处理 SQL 死锁的模式?

    我正在用 C 编写一个访问 SQL Server 2005 数据库的应用程序 该应用程序是数据库密集型的 即使我尝试优化所有访问 设置适当的索引等 我预计迟早会遇到死锁 我知道为什么会发生数据库死锁 但我怀疑我能否在某个时候发布不发生死锁的
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • 有没有更好的方法来获取每个项目与谓词匹配的子序列?

    假设我有一个 IEnumerable 例如 2 1 42 0 9 6 5 3 8 我需要获得与谓词匹配的项目的 运行 例如 如果我的谓词是 bool isSmallerThanSix int number 我想得到以下输出 2 1 0 5
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • 如何强制执行特定的 UserControl 设计

    我正在编写一个基本用户控件 它将由一堆其他用户控件继承 我需要对所有这些后代控件强制执行某种设计 例如 顶部必须有几个按钮以及一个或两个标签 后代用户控件区域的其余部分可以自由放置任何内容 最初 我认为我可以将一个面板放到 Base Use
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 将文本从文本文件添加到 PDF 文件[重复]

    这个问题在这里已经有答案了 这是我的代码 using FileStream msReport new FileStream pdfPath FileMode Create step 1 using Document pdfDoc new D

随机推荐

  • 对于每个循环:仅删除第一个附件

    在使用 for 每个循环复制附件后 我一直尝试删除 Outlook 中的附件 它只是在复制后删除第一个附件 但不会处理第二个附件 它只是下降到 End Sub Private Sub Items ItemAdd ByVal item As
  • 如何在 Laravel Vapor 应用程序中获取 HTTP 请求的 IP?

    我最近将 Laravel 应用程序从服务器移至 Vapor 此应用程序依赖于使用日志记录请求IP地址Request ip 但自从切换到 Vapor 后 所有 IP 都记录为 127 0 0 1 我查看了可信代理文档https laravel
  • 在 Observable 中 xhr.send() 之后获取服务器响应

    我实现了一种在 Angular 2 应用程序中发布文件的方法 它基于我找到的解决方案here https stackoverflow com a 35985489 2018084 由于 Angular 2 本身不支持文件上传 因此解决方案必
  • R 创建滑动窗口时间段内先前事件的统计

    任何人都可以帮助我解决使用 R 创建特定时间段内先前事件总和的问题吗 如果我不遵守协议 我深表歉意 这是我的第一个问题 我有一系列 ID 和活动日期 在真正的 df 中 事件是日期时间 但为了让事情更简单 我在这里使用了日期 我正在尝试创建
  • 谷歌图表增加y轴宽度增加

    如何增加 Google 图表 y 轴宽度 请找到图片 左侧全文未正确显示 请指导我 如何增加谷歌图表y轴宽度 https i stack imgur com jl1L2 jpg 需要调整图表和chartArea中的大小options 要为左
  • Visual Studio 2008 解决方案中的最佳项目数是多少?

    Visual Studio 2008 解决方案中的最佳项目数是多少 我们有一个 Visual Studio 2008 解决方案 目前约有 50 个项目 随着解决方案中的大部分项目由主应用程序的插件程序集组成 它可能会继续增长 如果一个解决方
  • JSON 数字正则表达式

    我正在尝试为 JSON 中的数字字符串编写正则表达式 我对编写正则表达式还是新手 我找到了 JSON 数字机器的图表 here http www json org 但我不知道如何攻击它 以下是正则表达式应找到的一些字符串 22 55 754
  • 已知为 iOS5 和 Storyboard 更新 MGSplitViewController 的努力?

    我正在开发一个 iPad 应用程序 需要隐藏 显示分割视图的主控制器 相关 SO 答案注释 Matt Gemmell 的MGSplitViewController https github com mattgemmell MGSplitVi
  • 即时视频结果

    我正在查询亚马逊的产品广告 API 以获取即时视频 流媒体 结果 一切工作正常 除了缺少一些信息 描述不包含在结果中 例如 在亚马逊上website电影 食品公司 http www amazon com Food Inc dp B002VR
  • 如何用 Perl 编写 HTTP 服务器?

    Perl 标准库 CPAN 或其他地方是否有 Web 服务器或 HTTP 服务器模块 我想我正在寻找Python 3的等价物http server模块 谢谢 此外HTTP 守护进程 http search cpan org perldoc
  • React Native 在多个并发 Android 模拟器上运行

    我想同时在至少 2 个 Android 模拟器上测试我的应用程序 我可以启动 2 个模拟器 但似乎找不到如何启动react native run android我的应用程序在 2 个带有 ADB 的模拟器上运行 如果可能的话我也希望能够运行
  • 确定两个列表是否包含相同的数字项而不进行排序

    我有两个列表 我需要确定它们是否包含相同的值而不进行排序 即值的顺序无关 我知道排序会起作用 但这是性能关键部分的一部分 项目值落在 2 63 范围内 我们总是比较相同大小的列表 但列表大小范围为 1 8 示例列表 A 0 0 4 23 1
  • 对在 django 中将 CSV 文件制作为 ZIP 文件感到困惑

    我有一个视图 它从我的网站获取数据 然后将其放入 zip 压缩的 csv 文件中 这是我的工作代码 没有 zip def backup to csv request response HttpResponse mimetype text c
  • Python os.path.dirname 更改目录时返回意外路径

    目前我不明白 为什么 pythonsos path dirname像它那样行事 假设我有以下脚本 Not part of the script just for the current sample file C Python Test t
  • 在 Web api 中使用 itextsharp 将 html 转换为 pdf 时出现异常

    项目清单 我正进入 状态 the uri prefix is not recognized itextsharp 例外 遵循我的 web api 控制器的方法 它接收 html 数据并将其转换为 pdf System Web Http Ac
  • 在C++中解析argc和argv

    我想学习更多 C 通常我会创建一个 for 循环来解析 argv 最后得到一堆 C 风格的字符串 我想在 C 中做类似的事情 但最好不要从 proc whatever 中读取 起初 我尝试将 C 风格字符串转换为 C 风格字符串 但没有结果
  • Tomcat 7 支持 Java 8 吗?

    In Tomcat官方页面 http tomcat apache org whichversion html它说 Tomcat 7 支持 Java 8 如果我下载这个并使用 Java 8 运行它就可以工作 但是 在 Openshift 上是
  • 如何使 gif 在黑莓 java 上完成后消失?

    我知道如何加载 gif 并让它运行 但是如何让它消失呢 IE 它位于另一个位图背景之上 看起来像与背景交互 我希望它在完成一次后消失 您可以将 gif 设置为不重复并使最终帧 100 透明
  • TextView的设置阻止其他TextView的跑马灯滚动

    这是在其他地方问过的 但该解决方案对我不起作用 因此 在更多背景下再次提出它 问题是活动包含滚动音乐标题文本视图 该视图被更新的经过时间计数器文本视图中断 我的活动布局中有这两个 TextView 小部件 尽管它们被其他布局容器包含
  • 尝试创建 100MB 缓冲区时出现分段错误

    我正在尝试将一个大的二进制文件写入 C 程序的缓冲区中 在尝试创建与文件读取大小相同的缓冲区后 GDB 总是会出现段错误 它要么在 fclose pf 倒带或 f open 上失败 这让我相信当我尝试创建缓冲区时出现了问题 我的代码段如下