gpt4 book ai didi

c - 发现段错误,但正在优化之前的消息

转载 作者:太空宇宙 更新时间:2023-11-04 06:13:55 26 4
gpt4 key购买 nike

我在 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.sogetc 中),通常不使用调试信息进行编译。在实践中,请相信您的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com