像许多年轻程序员一样,我学会了在代码不正常时,在不同的代码点插入大量“here1”,“here2”等打印到控制台的语句以确定程序出错的有用性。这种暴力调试技术在我整个计算机科学学习过程中多次拯救了我。然而,当我开始使用C语言编程时,我遇到了一个有趣的问题。如果我尝试运行
void* test;
printf("hello world");
test[5] = 234;
当没有为testChar分配内存时,会出现段错误。然而,从代码流程来看,逻辑上应该先输出“hello world”,然后才会发生段错误,但根据我的经验,通常情况下先出现段错误,而且根本不会在控制台上输出“hello world”。(我无法测试这个确切的例子,但是在使用Linux上的gcc时,我遇到过这种情况很多次。)我猜想这可能与编译器重新排列某些内容有关,或者printf使用某种异步刷新的缓冲区,因此不会立即输出。这完全是我自己的猜测,因为我真的不知道为什么会发生这种情况。在我使用的任何其他语言中,无论“testChar = ...”行引起了什么问题,“hello world”都将被打印,因此我可以确定问题所在。
我的问题是:当我编写C程序时,为什么会出现这种情况?为什么不先输出“hello world”?其次,是否有比这更好的C编程调试技术,以实现相同的基本功能?换句话说,有没有一种简单/直观的方法来查找代码中存在问题的行?