首页 > 解决方案 > 为什么 Pointer = NULL 被定义为干净的代码?

问题描述

所以我的编程老师告诉我们,如果你不使用指针但喜欢声明它,最好用 NULL 来初始化它。如果我什至不使用它,它如何防止任何错误?

或者如果我错了,它有什么好处?

标签: cpointersnull-pointer

解决方案


取消引用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();
}

推荐阅读