- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 GDB 在线调试器中编写了以下代码:
#include <stdio.h>
int main()
{
printf("jkjkkjkj");
int p , n;
FILE *fp;
printf("jkjkkjkj2");
fp = fopen("abc.txt","r");
while ( (n = getc(fp))!= EOF)
{
printf( "the chareacter here is %d \n", n);
}
n = fclose(fp);
return 0;
}
在执行代码时,我在尝试从文件中获取字符的行遇到段错误。我知道由于文件不存在,段错误即将到来。
但是,令我感兴趣的是我试图在屏幕上打印的消息的缺失。我尝试检查调试器,一旦发现:
optimized out written near the line no
但是,我尝试在各处放置 getchar()
,即使段错误仍然存在,消息也会打印在屏幕上。
这个怎么解释?为什么会这样?为什么当我将 getchar()
放在不同的地方时会打印消息?
我曾尝试在 Solaris 服务器上编写此代码并使用 GCC 进行编译。代码已编译,但即使存在目录中提供的名称的文件,我也没有收到任何输出消息。
最佳答案
作为answered by Yunnosch ,您可能忘记检查 fopen(3) 的失败.一个更好的习惯是总是至少通过编码来检查:
fp = fopen("abc.txt","r");
if (fp == NULL) { perror("fopen abc.txt"); exit(EXIT_FAILURE); };
并养成至少在任何地方都这样做的习惯。使用 perror(3) (或 strerror(3) 和 errno(3) )是一个有用的习惯,因为你想要一些与失败相关的原因(由 errno
给出,也许通过 perror
)。
更一般地说,始终阅读您正在使用的函数的文档(对于标准函数,至少在某些 reference 网站上,并且可能在 C11 标准中 n1570 ),并且 < strong>注意处理他们的失败(至少,通过检查失败并向 stderr
发送有用的消息退出);对于 Unix 函数,请参阅它们的 man
页面(在 Linux 上,从 intro(2) 和 intro(3) 开始;对于 Solaris,从 intro(2) 和 intro(3) .. 开始)。在您的 Unix 终端中,也尝试 man fopen
... 对于 POSIX 标准,开始 here .
what intrigues me is the absence of the messages that I am trying to print on the screen.
这很简单。 stdout 是缓冲的(另请参见 setvbuf(3) ),并且通常是行缓冲的。因此,不以 \n
结尾的 printf
的输出仍在缓冲区内,尚未显示在屏幕上。养成的习惯是几乎总是结束你的printf(3)使用换行符控制格式字符串,或者使用 fflush(3) 显式刷新缓冲区.
对于新手来说,没有理由避免以明确的 \n
结束你的 printf
。所以改用
printf("jkjkkjkj\n");
否则,请在您的程序中经常调用 fflush(NULL);
。顺便说一句,由于这些缓冲原因,fflush(NULL)
应该在调用 system(3) 之前完成, fork(2) , execve(2)以及其他重要的程序级功能。
optimized out written near the line no
这可能发生在 C standard library 中本身(例如在来自某些 libc.so
的 getc
中),通常不使用调试信息进行编译。在实践中,请相信您的 C 标准库:与 libc
中相比,您的代码中更有可能出现错误。
自己的源码要编译with gcc -Wall -Wextra -g
(要求 GCC 编译器以 DWARF 格式提供所有警告和调试信息,供 gdb
调试器使用)并且您需要改进您的代码以在 using the gdb
debugger 之前完全没有警告.
注意 undefined behavior ,花几个小时阅读有关 UB 的内容,并成为 scared UB 的。
关于c - 发现段错误,但正在优化之前的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50188967/
我正在寻找一种使此打印 HTML 代码 fragment 向后兼容旧 Android 版本的简单方法: @TargetApi(Build.VERSION_CODES.KITKAT) private v
我在 GCC 终端 (centos linux) 中为 ATM 项目编译以下 c 和 .h 代码时收到以下错误。请帮忙,因为我是编程新手。 validate_acc.h #ifndef _VALIDA
在写关于 SO 的不同问题的答案时,我制作了这个片段: @import url('https://fonts.googleapis.com/css?family=Shadows+Into+Light'
试图弄清楚我应该如何在 my_div_class 之前放置一个 span 而不是替换所有它。现在它取代了 div,但我不想这样做。我假设它类似于 :before 但不知道如何使用它。 { va
我正在使用选择库 http://github.hubspot.com/select/和 noUiSlider https://refreshless.com/nouislider/ .我面临的问题如下
我是开发新手,独自工作。我正在使用 Xcode 和 git 版本控制。可能我没有适本地组织和做错事,但我通常决定做 promise 只是为了在我破坏一切之前做出安全点。在那一刻,我发现很难恰本地描述我
我想确保在同一个桶和键上读取和写入时,应该更新获取的值,也就是说,应该在对其进行写入操作之后获取它。我怎样才能做到这一点? 我想要的是,如果我更新一个键的值,如果我同时使用不同线程获取值,则更新同一个
我的问题与this有关问题,已经有了答案: yes, there is a happens-before relationship imposed between actionsof the thre
The before and after hook documentation on Relish仅显示 before(:suite) 在 before(:all) 之前调用。 我什么时候应该使用其中
我有 CSV 行,我想在其中检测所有内部双引号,没有文本限定符。这几乎可以正常工作,但我的正则表达式还可以检测双引号后的字符。 CSV 部分: "7580";"Lorem ipsum";"";"Lor
是否可以通过Youtube数据API检查广告是否可以与特定视频一起显示? 我了解contentDetails.licensedContent仅显示视频是否已上传至同一伙伴然后由其声明版权。由于第三者权
考虑一下用漂亮的彩色图表描述的“像素管道” https://developers.google.com/web/fundamentals/performance/rendering/ 我有一个元素(比
之前?
在 MVC3 中,我可以轻松地将 jQuery 脚本标签移动到页面底部“_Layout.vbhtml” 但是,在 ASP.NET MVC3 中,当您使用编辑器模板创建 Controller 时,脚手
悬停时内容被替换,但是当鼠标离开元素时我希望它变回来。我该怎么做? $('.img-wrap').hover(function(){ $(this).find('h4').text('Go
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题 - 并包含有效代码以重现该问题。
版本:qwt 6.0.1我尝试开发频谱的对数缩放。我使用简单的线条来启用缩放plotspectrum->setAxisScaleEngine(QwtPlot::yLeft, new QwtLog10S
我有两个相同的表,I_Subject 和 I_Temp_Subject,我想将 Temp_Subject 表复制到 Subject 表。 I_Temp_Subject 由简单用户使用,I_Subjec
我的印象是第一次绘制发生在触发 DOMContentLoaded 事件之后。特别是,因为我认为为了让第一次绘制发生,需要渲染树,它依赖于 DOM 构造。另外,我知道 DOM 构造完成时会触发 DOMC
我是一名优秀的程序员,十分优秀!