C编程:seg fault,printf和相关的怪癖

C编程:seg fault,printf和相关的怪癖,第1张

概述正如许多年轻程序员所做的那样,我学会了在代码中的不同点插入大量“here1”,“here2”等多个打印到控制台语句的有用性,以确定我的程序何时出错.在我的CS研究中,这种强力调试技术为我节省了很多次.但是,当我开始用C语言编程时,我偶然发现了一个有趣的问题.如果我试着跑 void* test;printf("hello world");test[5] = 234; 当然,我为testChar 正如许多年轻程序员所做的那样,我学会了在代码中的不同点插入大量“here1”,“here2”等多个打印到控制台语句的有用性,以确定我的程序何时出错.在我的CS研究中,这种强力调试技术为我节省了很多次.但是,当我开始用C语言编程时,我偶然发现了一个有趣的问题.如果我试着跑

voID* test;printf("hello world");test[5] = 234;

当然,我为testChar而没有malloc’ing内存的段错误.但是,你会在逻辑上思考“hello world”会在seg故障发生之前打印出来,因为这是代码的流程,但根据我的经验,总是出现seg故障首先发生的情况,并且“你好世界” “根本没有打印到控制台. (我无法测试这个确切的例子,但是我在linux盒子上使用gcc多次遇到过这种情况.)我猜这与编译器重新排列一些东西和/或printf有关使用某种异步刷新的缓冲区,因此不是立即的.这完全是我的猜测,因为我老实说不知道为什么会这样.在我使用的任何其他语言中,无论“testChar = …”行引起什么问题,“hello world”仍会被打印,因此我可以确定问题所在.

我的问题是为什么在我编程C时会发生这种情况?为什么不首先打印你好世界?其次,有没有比这更好的C编程调试技术完成相同的基本 *** 作?如何,一个简单/直观的方法来找到有问题的代码行?

编辑:我偶然给了一个工作的例子哈哈.我现在拥有的应该是一个段错误.有趣的是,通常当我不想要一个段落错误时,我得到一个,现在当我真正想要一个我编写法律代码时!

解决方法 您发布的代码完全合法,不应导致段错误 – 不需要malloc任何东西.您的问题必须在其他地方 – 请发布导致问题的最小代码示例.

编辑:您现在编辑的代码具有完全不同的含义.仍然,没有显示“hello world”的原因是输出缓冲区尚未刷新.试试addinig

fflush( stdout );

在printf之后.

关于定位问题的根源,您有几个选择:

>使用__file__和__liNE__ C宏通过代码自由地散布printfs>学会使用调试器 – 如果您的平台支持核心转储,您可以使用核心映像查找错误的位置.

总结

以上是内存溢出为你收集整理的C编程:seg fault,printf和相关怪癖全部内容,希望文章能够帮你解决C编程:seg fault,printf和相关的怪癖所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222536.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存