Lio*_*lar 2 c malloc pointers initialization null-pointer
空指针可以重复使用吗?如果是,在什么条件下?
更具体地说,谁能告诉这段代码会发生什么?
int *p = 0;
p = (int*)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)
如果有问题——为什么?正确的做法是什么?
编辑:我知道没有必要这样做。我问的是为了理解指针在 C 中的工作方式会发生什么。
空指针可以重复使用吗?
是的
如果是,在什么条件下?
总是
您的问题实际上相当于询问何时可以重用int已设置为零或任何其他值。您需要知道的是,您无法撤消赋值,因此指针包含的任何值都将丢失。这是重新分配指针(无论为空还是非空)的唯一直接结果。任何问题都将是由于无法再访问以前的值而导致的。只要做得正确,重新分配本身总是好的。见下文。
当涉及到指针时,基本上有两个与此相关的常见问题。
悬空指针。free这将在您调用指针后发生。如果指针指向的对象超出范围,也会发生这种情况。悬空指针包含垃圾,取消引用它是未定义的行为。
内存泄漏。malloc如果您使用指针或类似指针分配了内存p,然后重新分配了指针,则可能会失去释放已分配内存的能力。
但重新分配指针始终是合法的。它包含什么值并不影响这一点。考虑这段代码:
...
int *p;
...
p = x;
Run Code Online (Sandbox Code Playgroud)
这是否可以完全取决于x。它的类型和值以及是否已初始化。
更具体地说,谁能告诉这段代码会发生什么?
它确实有效。但我有几点意见。
分配之前不必将指针初始化为 null。有人说这是一个好习惯。别人说不好。有利有弊,要看具体情况。我个人认为1总是使用它是不好的。
1简而言之,我的观点是,如果空初始化解决了一个问题,那么您的设计中可能会遇到一个更大的问题,初始化无法解决,而只是隐藏。
2有有效的用例。在这些情况下使用它,但请确保您理解为什么要这样做。
无需强制转换 malloc 的结果。再次,有人说这很好。有人说不好。我认为这很糟糕,除非你想用 C++ 编译器编译 C 代码。
不要使用sizeof(int). sizeof *p代替使用。
请参阅我是否会转换 malloc 的结果?阅读有关 2 和 3 的内容。
我会把你的代码写成
int *p = malloc(sizeof *p);
if(!p) {
// Handle error
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
840 次 |
| 最近记录: |