首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么打印到stdout会导致` `malloc():损坏的top size`,但打印到stderr工作正常?

打印到stdout会导致malloc():损坏的top size错误,但打印到stderr工作正常的原因是由于stdout和stderr在操作系统中是不同的输出流。

首先,让我们了解一下stdout和stderr的概念和分类。

stdout(标准输出)和stderr(标准错误)是在程序执行过程中用于输出信息的两个标准流。它们是在程序启动时由操作系统自动创建的,并且可以被程序用来输出不同类型的信息。

stdout用于输出程序的正常运行信息,例如程序的输出结果、提示信息等。而stderr则用于输出程序的错误信息,例如运行时错误、异常信息等。

接下来,我们来解释为什么打印到stdout会导致malloc():损坏的top size错误。

这个错误通常是由于程序在使用malloc函数进行内存分配时出现了问题。malloc函数用于动态分配内存,当程序尝试分配超过可用内存大小或者访问了无效的内存地址时,就会导致内存错误。

在某些情况下,当我们在程序中使用printf函数将输出信息打印到stdout时,可能会触发内存错误。这是因为stdout是一个缓冲输出流,它会将输出信息先存储在缓冲区中,然后再将其写入到终端或者其他输出设备中。

当我们使用printf函数打印信息到stdout时,如果程序在打印信息之前发生了内存错误,那么这个错误信息也会被写入到stdout的缓冲区中。然后,当程序尝试将缓冲区中的信息写入到终端时,就会触发内存错误,导致malloc():损坏的top size错误的出现。

相比之下,stderr是一个非缓冲输出流,它会直接将输出信息写入到终端或者其他输出设备中,而不需要先存储在缓冲区中。因此,当我们将输出信息打印到stderr时,即使程序发生了内存错误,也不会触发malloc():损坏的top size错误。

综上所述,打印到stdout会导致malloc():损坏的top size错误,但打印到stderr工作正常的原因是stdout和stderr是不同的输出流,stdout是一个缓冲输出流,而stderr是一个非缓冲输出流。当程序发生内存错误时,stdout的缓冲区可能会受到影响,导致malloc():损坏的top size错误的出现。而stderr直接将输出信息写入到终端,不需要使用缓冲区,因此不会触发这个错误。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各种业务需求。产品介绍链接
  • 腾讯云云数据库MySQL版:提供高性能、可扩展的MySQL数据库服务。产品介绍链接
  • 腾讯云对象存储(COS):提供安全、稳定、低成本的云端存储服务。产品介绍链接
  • 腾讯云人工智能平台(AI Lab):提供丰富的人工智能算法和模型,帮助开发者快速构建人工智能应用。产品介绍链接
  • 腾讯云物联网平台(IoT Hub):提供全面的物联网解决方案,帮助用户连接和管理物联网设备。产品介绍链接
  • 腾讯云移动应用开发平台(MADP):提供一站式移动应用开发和运营服务,帮助开发者快速构建和发布移动应用。产品介绍链接
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基础IO--重定向&&缓冲区&&stderr

在语言中层,有stdin、stdoutstderr,我们使用printf/fprintf函数都是调用stdout。...我们在写程序时会有两种情况,正确or错误,不管是正确还是错误,都是往1号fd中,一旦出错,就往2号下标里面,这样错误信息和正确信息在文件层面上就分开了。.../a.out 1>all.txt 2>&1是一个命令行输入,它将程序标准输出(stdout)重定向到all.txt文件,并将标准错误输出(stderr)也重定向到同一个文件。...具体地说,1>表示将stdout重定向到文件all.txt,2>&1表示将stderr重定向到与stdout相同位置,即all.txt文件。...执行该命令后,程序所有输出(包括正常输出和错误信息)都将写入到all.txt文件中。

8300
  • 一日一技:怎么>重定向不过去了?

    当我们打开文件时候,发现数据已经在文件里面了。 可是,今天我遇到了一个 Python 文件。...直接运行时候,跟正常没有什么区别,如下图所示: 但是,当我尝试重定向时候,却发现数据依然是直接打印到终端,如下图所示: 并且,可以看到生成 result2.txt 文件也是空。...导致这个问题原因,是因为输出到终端有两种方式,分别是stdoutstderr。当你直接使用print函数打印数据时候,你输出内容默认是使用stdout方式输出。...这个时候,我们可以修改一下重定向命令: python3 test_print2.py 1>out.txt 2>err.txt 运行效果如下图所示: 这样一来,stdout输出内容,重定向到out.txt...文件中,而stderr输出内容,重定向到err.txt中。

    54620

    【Linux】 基础IO——文件(下)

    文件描述符为什么从3开始使用?...,默认会打开当前进程三个文件: 标准输入、标准输出、标准错误 ——本质都是文件 C语言:标准输入(stdin) 标准输出(stdout) 、标准错误(stderr) ——文件在系统层表现 C++:...fprintf(stdout,"hello printf->stdout\n ");//将数据向stdout进行输出 fprintf(stderr,"helllo printf->stderr...节省调用者时间 系统调用也花费时间 可能写了10次,如果每次调用fprintf传给操作系统 都要花费时间 若都写入缓冲区中,统一传给操作系统 效率就变高了 ---- write接口不论有没有重定向...,都会正常打印,因为调用write是系统调用 没有缓冲区,直接调用就写给操作系统了 而使用fprintf ,数据先写入缓冲区 当要打印到显示器中时 刷新策略:行缓冲 因为打印内容都存在\n,在调用fork

    2.1K30

    Python重定向标准输入、标准输出和标

    (如果你在一个基于窗口Python IDE系统上工作stdout 和 stderr 缺省为“交互窗口”。)...象 stdoutstderr 并不为你增加回车换行符;如果需要,要自已加上。 stdout 和 stderr 都是类文件对象,就象我们在提取输入源中所讨论一样,但它们都是只写。...始终在重定向 stdout 之前保存它,这样你可以在后面将其设回正常。 打开一个新文件用于写入。 将所有后续输出重定向到我们刚打开新文件上。...将我们新打开日志文件文件对象赋给 stderr 重定向标准错误。 引发一个异常。从屏幕输出上我们可以注意到这样没有在屏幕上打印出任何东西。所以正常跟踪信息已经写进 error.log。...第一个程序简单地输出到标准输出(本身不需要任何特别的重定义,只是执行正常 print 什么),同时下个程序从标准输入读入,操作系统小心地将一个程序输出连接到下一个程序输入。 例 5.35.

    4K10

    理解 Linux shell 中一个方言:2>&1

    下面看一个命令示例,然后分析下他是如何工作: ls foo > /dev/null 2>&1 首先需要了解两个基础概念:I/O重定向、文件描述符 I/O重定向 重定向 作用是把一个命令输出结果发送到另一个地方...例如,使用 cat 命令查看一个文件,文件内容会被打印到屏幕 : $ cat foo.txt foo bar baz 此时,屏幕就是命令标准输出( standard output 【stdout】)位置...再看一个例子,查看一个不存在文件: $ cat nop.txt > output.txt cat: nop.txt: No such file or directory 这里错误提示信息为什么显示到了屏幕...所以,标准输出stdout与 标准错误输出stderr也有自己文件描述符: stdout 为 1 stderr 为 2 综合 $ cat foo.txt > output.txt 实际上就是这样:...小结 几个关键点: 两个输出:标准输出(stdout 正常信息)、标准错误输出(stderr 错误信息) > 可以改变输出位置 文件描述符,stdout -> 1,stderr -> 2 command

    981120

    GO日志怎么玩

    2021/06/xx xx:25:53 小魔童日志 ... 2021/06/xx xx:25:53 Hello wrold 小魔童日志 ... 2021/06/xx xx:25:53 小魔童 日志...,例如上述小案例打印日志,你就不知道具体是代码哪一行打印出来,以及设置日志打印到哪个日志文件里面,等等 咱们一起来看看如何配置 log,从创建logger开始看起 新建一个 logger 咱们在基本日志上...,加上一个前缀 func main() { // 打印到标准输出上 myLog := log.New(os.Stdout, "", log.Lshortfile|log.Ldate|...,具体每一个字段是做什么,用了之后是什么样效果,根据这个注释,一目了然 咱们查看源码就知道,为什么上述小案例,日志里面默认就输出了 日期、时间、具体内容,因为 log包里面会默认 New 一个日志...,供我们默认使用 此处 var std = New(os.Stderr, "", LstdFlags) New 里面的第三个参数需要填属性,此处默认填了 LstdFlags LstdFlags = Ldate

    48820

    how2heap学习(下)

    ; printf("\nfree b,首先会跟 top chunk 合并,然后因为 b prev_size 是 0,所以跟前面的 fake chunk 合并,glibc 寻找空闲块方法是...然后我们释放掉 b,这时候 b 因为与 top chunk 挨着,top chunk 合并,然后因为 prev_inuse 是 0,所以根据 prev_size 去找前面的 free chunk...fprintf(stderr, "假设存在堆溢出,把 top chunk size 给改为一个比较小 0xc01\n"); top = (size_t *) ( (char *)...如果要覆盖堆栈地址不为零,则需要再释放6个指针,否则攻击将导致分段错误。但是,如果堆栈上值为零,那么一个空闲就足够了。...它包含一个指向列表中下一个块指针,这就是为什么将堆指针写入堆栈原因。前面我们说过,如果释放少于6个额外指向fastbin指针,仅当堆栈上值为零时,攻击也将起作用。

    59841

    Console 模块解读及简单实现

    * depth - 表示最大递归层数。如果对象很复杂,可以指定层数控制输出信息多少。 * 如果不指定depth,默认递归3层,指定为null表示不限递归层数完整遍历对象。...= Logger; Logger 模块基本使用 日志输出至终端 无特殊说明,日志都是默认打印到控制台,在一些代码调试中也是用最多。...; // 内容输出到 stdout.txt 文件logger.error('错误日志记录'); // 内容输出到 stderr.txt 文件 版本问题 将日志信息打印到本地指定文件,这里要注意版本问题,...有时可能一瞬间就能写到一个文件,当系统处于高负载时,管道接收端可能不会被读取、缓慢终端或文件系统,因为事件循环被阻塞足够频繁且足够长时间,这些可能会给系统性能带来消极影响。...当你向一个交互终端会话写时这可能不是个问题,当生产日志到进程输出流时要特别留心。

    1.2K10

    Bash中文件描述符详细介绍

    前言 Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统标准输入设备STDIN,通常情况下STDIN值为键盘,如read命令就默认从...默认文件描述符也是可以被替换, 例如我们可以替换掉 stdout 到一个文件, 这样命令输出就不是打印到终端, 而是被输出到文件中: ?..., 按照从左往右顺序依次执行....后, 我们就可以在 /tmp/stderr 文件中看到命令正常输出了; 让我们来开始实验吧: ➜ test exec 2> /tmp/stderr ➜ test ls a.txt ➜ test ls...such file or directory ➜ blog git:(hexo) 总结 以上就是这篇文章全部内容了,希望本文内容对大家学习或者工作具有一定参考学习价值,如果有疑问大家可以留言交流

    1.2K43

    Linux 里 2>&1 究竟是什么

    2>1和2>&1写法有什么区别: 2>1作用是把标准错误输出重定向到1,这个1不是标准输出,而是一个文件!!!...其实不是,command 1>a 2>&1与command 1>a 2>a还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致 stdoutstderr 覆盖。...这里我们弄了两条命令,其中t指令并不存在,执行会报错,输出到stderr。date能正常执行,执行会输出当前时间,输出到stdout。 执行..../test.sh > res1.log结果为: 我们发现stderr并没有被重定向到res1.log中,stderr被打印到了屏幕上。这也进一步证明了上面说....其实这种用法也是可以,ls 命令列出当前目录,用stdout(1)表示,由于这个时候没有stderr(2),这个时候执行ls 2>a也正常产生一个 a 文件,但是 a 文件中是空,因为这时候执行

    3.8K10

    【Linux系统调用API】一、open与close函数

    在文件在文件指针中,包含了一个文件描述符,这个文件描述符用于指定目标文件,默认情况下就是STDOUT_FILENO也就是标准输出1号描述符;f_pos指定了读写位置,比如我们打印时候他不停在上一次打印末尾位置打印后面的内容...虽然1号文件描述符当前已经不是标准输出(终端显示屏)了,但是stdout依然是指向1号文件描述符,实际上这就相当于把open()打开文件当作标准输入输出,printf()打印内容都会打印到test.log...首先我们屏蔽fflush()函数试一下 这个test.log文件内是空,也就是说,如果不刷新缓冲区的话,无法正常打印内容,我们把刷新函数fflush()加上就可以看到,printf()函数打印内容直接打印到...它们分别对应C语言中stdin、stdoutstderr。...、stdoutstderr对象关系不会变,并且在后续操作中会把0、1、2指向新文件当作标准输入输出和标准错误去处理,并将输入输出或错误信息打印到这个文件。

    14410

    C 标准库基础 IO 操作总结

    二、关于stdin/stdout/stderr 在用户程序启动时,main 函数还没开始执行之前,自动打开三个 FILE* 指针分别是:stdin、stdoutstderr,这三个文件指针是 libc...stdin 只用于读操作,称为标准输入 stdout 只用于写操作,称为标准输出 stderr 也用于写操作,称为标准错误输出 通常程序运行结果打印到标准输出,而错误提示打印到标准错误输出,一般标准输出和标准错误都是屏幕...fputc(c, stdout)。...,而是打印到用户提供缓冲区中并在末尾加 ‘\0’,由于格式化后字符串长度很难预计,所以很可能造成缓冲区溢出,强烈推荐 snprintf 更好一些,参数 size 指定了缓冲区长度,如果格式化后字符串超过缓冲区长度...flush 操作,如果: 用户程序调用库函数从无缓冲文件中读取 或从行缓冲文件中读取,且这次读操作引发系统调用从内核读取数据,那么读之前自动 flush 所有行缓冲 程序退出时通常也自动 flush

    97230

    Console 模块解读及简单实现

    * depth - 表示最大递归层数。如果对象很复杂,可以指定层数控制输出信息多少。 * 如果不指定depth,默认递归3层,指定为null表示不限递归层数完整遍历对象。...= Logger; Logger 模块基本使用 日志输出至终端 无特殊说明,日志都是默认打印到控制台,在一些代码调试中也是用最多。...; // 内容输出到 stdout.txt 文件 logger.error('错误日志记录'); // 内容输出到 stderr.txt 文件 版本问题 将日志信息打印到本地指定文件,这里要注意版本问题...有时可能一瞬间就能写到一个文件,当系统处于高负载时,管道接收端可能不会被读取、缓慢终端或文件系统,因为事件循环被阻塞足够频繁且足够长时间,这些可能会给系统性能带来消极影响。...当你向一个交互终端会话写时这可能不是个问题,当生产日志到进程输出流时要特别留心。

    63020

    Shell脚本攻略04-玩转文件描述符及重定向

    理论知识 在编写脚本时候频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。 通过内容过滤将输出重定向到文件是我们平日里基本任务之一。...当命令输出文本时,这些输出文本有可能是错误信息,也可能是正常(非错误)输出信息。 单靠查看输出文本本身,我们没法区分哪些是正常,哪些是错误。.../cmdRW.sh /root/Templates 0 RIGHT [root@entel1 Templates]# ---- 默认stderr印到屏幕上 下面的命令会将stderr文本打印到屏幕上...和stdout重定向到同一个文件中 还可以利用下面这个更好方法将stderr转换成stdout,使得stderrstdout 都被重定向到同一个文件中 $ cmd >output.txt 2...---- 工作原理 就输出重定向而言, >和>>并不相同。尽管两者可以将文本重定向到文件,但是>先清空文件,然后再写入内容,而>>会将内容追加到现有文件尾部。

    86810

    文件底层深入理解之文件输入输出重定向

    二、对输出重定向现象理解 正如上面这段代码所示,printf打印内容并没有向显示器上,而是输出到了log1.txt文件里面,这又是为什么呢?...文件,操作系统检测到你这个进程文件描述符表中最小没有被使用数组下标为1,所以就把log1.txt文件地址填入了1位置,这是在操作系统层面上做工作。...而在上层语言层面上,stdout这个文件文件描述符仍然为1,而且printf函数只认stdout这个文件,只会往stdout这个文件进行写入,stdout文件通过它文件描述符在底层文件描述符表中进行查找时候找到...下面是图解: 上面这一段代码有一个小细节需要注意,就是你在进程结束之前不能关闭该文件。...dup2()这个接口是指在文件描述符中将newfd位置地址改成oldfd位置地址,具体实现如下所示: 1、输出重定向 fd位置文件地址覆盖了原本1位置上文件地址,结果就将本来应该打印到屏幕上一串

    10210
    领券