zoukankan      html  css  js  c++  java
  • C语言中NULL的定义

    用C语言编程不能不说指针,说道指针又不能不提NULL,那么NULL究竟是个什么东西呢? C语言中又定义,定义如下:

    #undef NULL
    #if defined(__cplusplus)
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif

    所以我觉得,如果一个指针被赋予NULL,应该就相当于这个指针执行了0x0000这个逻辑地址,但是C语言中0x0000这个逻辑地址用户是不能使用的(有些人说是因为0x0000没有映射到物理地址,也有人说是因为0x0000映射到的地址是操作系统用于判断野指针的,我也不太懂,总之就是用户不能使用啦),所以当你试图取一个指向了NULL的指针的内容时,就会提示段错误,听着有点绕,看程序:

    int *node=NULL;
    int a=0;
    a=*node;

    printf("%d ",a);
    
    

    由于node执行的是NULL,也就是逻辑地址0x0000,而这个地址用于是不能访问的,所以编译器提示段错误。

    还在网上看到了一个面试题,和这个问题有关,分享一下:

    #include <stdio.h>
    
    void fun(int *node)
    {
        static int N=100;
        node=&N;
    }
    int main()
    {
        int *node=NULL;
        int a=0;
        fun(node);
        a=*node;
        printf("%d
    ",a);
        
        return 0;
    
    }

    运行结果依然是段错误。因为函数是值传递,node指针变量的值并没有被改变,所以这个程序的效果和上一个程序的效果是一样的。

    如果要让结果为100,应该怎样写代码呢? 答案是 传递node指针变量的指针给fun,也就是传递一个二级指针,当然相应的fun函数也应该做出改变,代码如下:

    #include <stdio.h>
    
    void fun(int ** node)
    {
        static int N=100;
        *node=&N;
    }
    
    int main()
    {
        int *node=NULL;
        int a=0;
    
        fun(&node);
        a=*node;
    
        printf("%d
    ",a);
        return 0;
    
    }

    就写到这里,希望对大家有帮助。不对的地方还请指正。谢谢~~~

  • 相关阅读:
    Spark Streaming
    RDD转换DataFrame
    Spark学习笔记之-Spark远程调试
    Spark集群模式&Spark程序提交
    spark-submit的参数名称解析
    Scala java maven开发环境搭建
    git报错之index.lock
    mongodb导出数据表命令之mongoexport
    用casperjs模拟登录,支持多个账户登录
    关于casperjs的wait方法的执行顺序
  • 原文地址:https://www.cnblogs.com/qingergege/p/6494751.html
Copyright © 2011-2022 走看看