c - 为什么 Pointer = NULL 被定义为干净的代码?
问题描述
所以我的编程老师告诉我们,如果你不使用指针但喜欢声明它,最好用 NULL 来初始化它。如果我什至不使用它,它如何防止任何错误?
或者如果我错了,它有什么好处?
解决方案
取消引用NULL
很可能(保证?)导致分段错误,立即使您的应用程序崩溃并提醒您刚刚执行的不安全内存访问。
保持指针未初始化将意味着它仍然具有该内存的前一个用户留下的任何垃圾。它完全有可能成为指向应用程序中真实内存区域的指针。取消引用它将是未定义的行为,可能会导致段错误,也可能不会。后者是最坏的情况,你应该担心。您的应用程序将继续伴随由此产生的任何无意义的行为。
这是一个演示:
#include <stdio.h>
#include <stdlib.h>
void i_segfault() {
fflush(stdout); // Flush whatever is left of STDOUT before we blow up
int *i = NULL;
printf("%i", *i); // Boom
}
void use_some_memory() {
int *some_pointer = malloc(sizeof(int));
*some_pointer = 123;
printf(
"I used the address %p to store a pointer to %p, which contains %i\n",
&some_pointer, some_pointer, *some_pointer
);
}
void i_dont_segfault() {
int *my_new_pointer; // uninitialized
printf(
"I re-used the address %p, which still has a lingering value %p, which still points to %i\n",
&my_new_pointer, my_new_pointer, *my_new_pointer
);
}
int main(int argc, char *argv[]) {
use_some_memory();
i_dont_segfault();
i_segfault();
}
推荐阅读
- c++ - 修改后的文件出现意外的 fgets 行为
- sass - Hugo:从 GitHub 导入 sass / 代码的最佳方式?
- asp.net-core - Entity FrameWork Core 不显示查询返回的值
- performance - Dart - 异步与同步性能注意事项
- .net-core - .Net Core 中的文档审批工作流程(无 SharePoint)
- python - TypeError:“NoneType”对象不可迭代,边界检测 OpenCV
- stata - 如何在Stata中将因子/组变量添加到线图中
- r - 如何交替 3(数字)列的数值并将其放入一列?
- javascript - 是否可以使用 JavaScript 手动触发 DOM 事件?
- c++ - 错误:- 使用二次方程拆分中间项的程序