IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C陷阱与缺陷之空指针并非空字符串

    TacuLee发表于 2016-01-07 06:55:23
    love 0

    除了一个重要的例外情况,在C语言中将一个整数转换为一个指针,最后得到的结果都取决于具体的C编译器的实现。这个特殊情况就是常数0,编译器保证由0转换而来的指针不等于任何有效的指针。出于代码文档化的考虑,常数0这个值常用一个符号来代替:

    #define NULL 0

    当然无论是直接用常数0,还是用符号NULL,效果都是相同的。需要记住的重要一点是,当常数0被转换为指针使用时,这个指针绝对不能被解除引用(dereference)。换句话说,当我们将0赋值给一个指针变量时,绝对不能企图使用该指针所指向内存中存储的内容。下面的写法是完全合法的:

    if (p == (char *) 0) …

    但是如果要写成这样:

    if (strcmp(p, (char *) 0) == 0) …

    就是非法的了,原因在于库函数srcmp的实现中会包括查看它的指针参数所指向内存中内容的操作。

    如果是一个空指针,即使

    printf(p);

    和

    printf(“%s”,p);

    的行为也是未定义的。而且,与此类似的语句在不同的计算机上会有不同的效果。

    未经允许不得转载:TacuLee » C陷阱与缺陷之空指针并非空字符串



沪ICP备19023445号-2号
友情链接