微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Pointer = NULL 被定义为干净的代码?

如何解决为什么 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();
}
,

至少有两种方法可以确保您的程序不使用未初始化的指针:

  • 您可以仔细设计和编写您的程序,以确保程序控制永远不会流经使用该指针的路径,而无需先对其进行初始化。
  • 您可以将指针初始化为 NULL

第一个可能很困难,具体取决于程序,并且人类会不断犯错误。第二个很简单。

另一方面,第二个只能解决一个问题:它确保如果您使用指针而不初始化它,它将有一个赋值。此外,在许多系统中,它确保如果您尝试使用该值访问指向的对象,您的程序将崩溃而不是做更糟糕的事情,例如损坏数据并产生错误结果或删除有价值的信息。

这是一个需要解决的有用问题,因为这意味着在测试期间可能会发现未能分配所需值的错误,即使没有,可能造成的损害也可能是有限的。但是,这并不能解决确保指针在使用之前被分配所需值的问题。因此,与这些代码建议中的许多建议一样,它是帮助限制人为错误的有用提示,但它不是一个完整的解决方案。

,

如果您不初始化变量(错误地),问题是您的程序可能比正常情况更异常。假设您声明了一个值为 enumONETWOTHREE,但您忘记初始化它,并且在某些时候您包含以下代码:>

switch(my_var) {
case ONE: /* do one */
    ...
    break;
case TWO: /* do two */
    ...
    break;
case THREE: /* do three */
    ...
    break;
}

并且您可能会发疯,因为您假设应该执行该类型的至少一个可能值......但这根本不是真的,因为变量尚未初始化并且该值甚至不需要遵守对其所表示的数据类型施加的约束。

初始化一个变量可能会在您的代码中引入几条简短的指令,但在搜索错误时可以避免很多噩梦。

在未初始化指针的情况下,情况更糟,因为许多程序员free()根据测试从堆分配内存

if (var) free(var);

并且很可能一个未初始化的指针类型的自动变量会指向某个地方,并且会被尝试free()d。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。