许多年轻程序员都这样做,我学会了在代码中的不同点插入大量“here1”,“here2”等打印到控制台语句的用处弄清楚我的程序何时会出错。这种强力调试技术为我的CS研究节省了很多次。但是,当我开始用C编程时,我偶然发现了一个有趣的问题。如果我试着运行C编程:seg故障,printf和相关的怪癖
void* test;
printf("hello world");
test[5] = 234;
当然,我得到了一个段错误,用于没有为malloc测试testChar的内存。然而,从逻辑上来说,在seg故障发生之前会打印出“hello world”,因为这是代码的流向,但根据我的经验,seg故障总是首先发生,而“hello world “永远不会被打印到控制台上。 (我无法测试这个确切的例子,但是我已经在Linux机器上多次使用gcc遇到过这种情况)。我猜这与编译器重新安排一些事情和/或printf使用某种不同步刷新的缓冲区,因此不会立即生效。这完全是我的猜测,因为我真的不知道为什么会发生。在我使用的任何其他语言中,无论“testChar = ...”行产生什么问题,“hello world”都会被打印出来,因此我可以确定问题所在。
我的问题是为什么当我编程C时会发生这种情况?为什么不是先打印出你好的世界?其次,是否有比此更好的C编程调试技术来实现相同的基本功能?在中,一种简单/直观的方式来查找是问题的代码行?
编辑:我偶然发现了一个实例哈哈。我现在拥有的应该会导致段错误。这很有趣,通常当我不要想要一个segfault我得到一个,现在当我真的想要一个我写法律代码!
我曾经这么想过。*尽管我正在精神上,但会划伤头部。 – 2009-06-10 13:10:59
对不起,大声笑,我解决了我的代码,这是一个真正的问题。我需要任何会导致段错误的东西。 – JoeCool 2009-06-10 13:11:34
“哦,这是坏的废话”将被存储在符号区(?)中,并且指针被存储在testChar中...您可以使用调试器查看它。 – stefanB 2009-06-10 13:12:06