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
在coords
fread(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 关注
- 678 浏览
添加回答
举报