【发布时间】:2016-07-14 04:53:57
【问题描述】:
我已经很久没有碰过C了。我的第一语言是 C。但后来我们被教过 C++、Java 和 C#(在大学时代)。现在我的工作主要涉及 Java 和 groovy。突然间我不得不再次做C。我不熟悉行业如何使用 C,因为我从未在项目中使用 C 做事。
我从 Eclipse CDT 开始,在 Windows 10 上使用 MinGW。我的新程序迅速发展壮大。我的经验不足并没有向我透露。当我运行时,我的程序曾经崩溃,显示 Windows 对话框说“MyProgram.exe 已停止工作”。现在我不知道出了什么问题。编译很干净,没有错误,但只有一个警告。现在自从来自 Java 世界以来,我觉得警告并不是那么致命。所以我只是忽略了它(我那是我缺乏 C 经验)。并继续调试发现原因。意识到警告确实是关于原因的。因在调试中浪费时间而感到沮丧。
所以这是我原始代码中的代码复制问题:
1 #include "stdio.h"
2 #include "limits.h"
3
4 typedef struct TempStruct TempStruct;
5
6 struct TempStruct
7 {
8 int a;
9 TempStruct *next;
10 };
11
12 int function1(TempStruct *param)
13 {
14 return param == NULL;
15 }
16
17 int function2(TempStruct **param)
18 {
19 if(function1(param))
20 {
21 return INT_MIN;
22 }
23 *param = (*param)->next;
24 return 0;
25 }
26
27 int main()
28 {
29 TempStruct *tempStructObj = NULL;
30 function2(&tempStructObj);
31 printf("Does not reach here!!!");
32 return 0;
33 }
我的 C-noob 眼睛没有发现任何问题。很好,我知道如何进行调试。我在调试中得到了以下结果:
在main() 中完成:*tempStructObj = NULL。所以,我期待 function1() 返回 1,使 function2() 从第 21 行返回。
问题是function1() 需要TempStruct*。但是在第 19 行,我通过了**param。所以在function1(),param 里面没有NULL。所以它返回了false(我猜是0)。所以function2() 没有从第 21 行返回。它执行了(*param)->next,因此程序崩溃了。
我的问题:
- Q1. 这样的问题不应该报告为错误而不是警告吗?是否有任何设置可以将此类潜在的致命警告报告为错误?
- Q2. eclipse 会在某处记录这种突然的应用程序崩溃的原因吗?因此,无需逐行调试,我可以简单地参考报告,该报告可能会指定导致崩溃的行号
- Q3. 处理此类错误的行业标准方法是什么?当然有人会说不要犯错误。但我问的是为避免此类错误或自动检测它们而采取的预防措施。像上面一样,我询问了有关使 eclipse 将问题报告为致命问题或使崩溃生成报告的设置,以便可以快速修复问题,而不是数小时的调试。您是否使用(eclipse CDT + MinGW + Windows)更好的(并且可能涉及更小的学习曲线)替代方案来提供更强大的调试,以便我可以避免此类错误。
-
Q4. 在上图的第 1 点中,
Error: Multiple errors reported...是什么。这种事情偶尔会发生,但并非总是如此,比如在 5 个调试会话中发生一次。这种临时行为背后的原因是什么? -
Q5. 在上图的第 3 点中,
param在function1()中的 (0x62ff2c) 值是多少?如果我将function1()的签名正确地保留为int function1(TempStruct **param)并将内部引用正确更改为*param,则*param是正确的0x0(即NULL):编辑
【问题讨论】:
-
看起来您使用的是 c,但不是 c++。为什么要添加 c++ 标签?
-
哦,删除了
c++标签。 -
花了很多精力进行调试,然后写了一个问题和一个关闭请求,但没有评论我做错了什么,值得关闭...:\
-
只写function2(tempStructObj),对于Q1,你需要找到像-wall这样的编译器标志,它可以启用最高级别的警告,对于Q5,它是指向param的指针,它本身就是一个指针。参数的值为NULL,但它的地址为0x62ff2c。
-
您一次只能提出一个明确的、与主题相关的问题。见How to Ask。
标签: c eclipse pointers eclipse-cdt