2 回答
TA贡献1851条经验 获得超4个赞
在以下情况下,您可能具有未定义的行为:
int nbins;不初始化nbins,因此它包含垃圾数据,可能是非常大的数字。fread(&nbins, sizeof(int), 1, fd);未经测试,因此可能会失败并保持nbins未初始化状态。了解有关fread的信息。printf("nbins = %d", nbins);有没有\n和后面没有一个明确的fflush,所以不要显示任何东西(因为stdout是通常行缓冲)。coords = malloc(nbins * sizeof(float));将要求大量的内存,所以会失败,并得到NULL在coordsfread(coords, sizeof(float), nbins, fd);NULL自UB以来写入指针,给出分段违规
你很幸运。事情可能变得更糟(我们所有人都可能被黑洞摧毁)。你也可以尝试一些鼻恶魔,甚至更糟的是,有一些执行这似乎对明显的工作。
下次,请避免UB。我不想消失在黑洞中,所以请忍受。
顺便说一句,如果您使用GCC,请编译所有警告和调试信息:gcc -Wall -Wextra -g。它会警告您。如果没有,您将在gdb调试器下获得SEGV 。在Linux上,valgrind和strace都可以提供帮助。
请注意,无用的初始化(例如,在您的情况下为显式 int nbins = 0;)在实践中不会有害。如果它们没有用(并且当它们不是无用的时(如您的情况,它们非常快)),则优化编译器可能会删除它们。
必读
拉特纳(Lattner)的博客:每个C程序员应了解的UB知识。相关概念:假设规则。
另请阅读您正在使用的每个功能的文档(甚至与一样常见printf)。
- 2 回答
- 0 关注
- 788 浏览
添加回答
举报
