正如许多年轻的程序员所做的那样,我学会了在代码的不同点插入大量“here1”、“here2”等打印到控制台的语句来找出我的程序何时出错的有用性。在我的 CS 学习过程中,这种蛮力调试技术为我节省了很多很多次。然而,当我开始用 C 编程时,我偶然发现了一个有趣的问题。如果我试着跑
void* test;
printf("hello world");
test[5] = 234;
当然,我得到一个段错误,因为我没有为 testChar 分配内存。但是,从逻辑上讲,您会认为“hello world”会在段错误发生之前打印,因为这是代码的流程,但根据我的经验,总是首先发生段错误,并且“hello world” " 根本不会打印到控制台。(我无法测试这个确切的例子,但我在linux机器上使用gcc多次遇到这种情况。)我猜这与编译器重新排列一些东西和/或printf有关使用某种异步刷新的缓冲区,因此不是立即的。这完全是我的猜测,因为我真的不知道为什么会发生。在我使用过的任何其他语言中,无论出现什么问题,“testChar =...
我的问题是为什么在我编写 C 语言时会发生这种情况?为什么不先打印hello world?其次,是否有比这更好的 C 编程调试技术来完成相同的基本任务?例如,一种简单/直观的方法来查找有问题的代码行?
编辑:我偶然给出了一个工作示例哈哈。我现在拥有的应该会导致段错误。有趣的是,当我不想要一个段错误时,我通常会得到一个,而现在当我真正想要一个时,我会编写合法代码!