跳转到内容

C 语言空指针

来自代码酷
Admin留言 | 贡献2025年4月29日 (二) 04:46的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

模板:Note

C语言空指针(Null Pointer)是指向内存地址0的特殊指针,用于表示指针不指向任何有效对象或函数。在C标准中,空指针由宏NULL定义,其实际值取决于实现(通常是(void*)0)。

基本概念[编辑 | 编辑源代码]

空指针在C语言中有以下核心特性:

  • 解引用空指针会导致未定义行为(通常是程序崩溃)
  • 所有指针类型都可以被赋值为NULL
  • 空指针在布尔上下文中被视为(false)
  • 空指针与指向内存地址0的指针概念不同(尽管实现可能相同)

标准定义[编辑 | 编辑源代码]

C11标准(ISO/IEC 9899:2011)第6.3.2.3节规定:

"值为0的整型常量表达式,或强制转换为void*的此类表达式,称为空指针常量。"

语法与示例[编辑 | 编辑源代码]

声明空指针[编辑 | 编辑源代码]

int *ptr = NULL;    // 整型空指针
char *str = NULL;   // 字符型空指针
void *vp = NULL;    // 通用空指针

检测空指针[编辑 | 编辑源代码]

#include <stdio.h>

int main() {
    int *ptr = NULL;
    
    if (ptr == NULL) {
        printf("指针为空\n");
    } else {
        printf("指针指向地址: %p\n", (void*)ptr);
    }
    
    return 0;
}

模板:Output

技术细节[编辑 | 编辑源代码]

内存表示[编辑 | 编辑源代码]

graph LR A[指针变量] -->|存储值| B[0x00000000] B --> C[不指向任何有效内存]

与零指针的区别[编辑 | 编辑源代码]

特性 空指针 零指针
表示"无指向" | 指向地址0
所有实现一致 | 实现相关
绝对禁止 | 可能允许(系统相关)

实际应用[编辑 | 编辑源代码]

链表终止标记[编辑 | 编辑源代码]

struct Node {
    int data;
    struct Node *next;  // 空指针表示链表结束
};

void printList(struct Node *n) {
    while (n != NULL) {
        printf("%d ", n->data);
        n = n->next;
    }
}

动态内存分配错误处理[编辑 | 编辑源代码]

#include <stdlib.h>

int *create_array(size_t size) {
    int *arr = malloc(size * sizeof(int));
    if (arr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        exit(EXIT_FAILURE);
    }
    return arr;
}

常见误区[编辑 | 编辑源代码]

  • 误区1:认为NULL0可以无条件互换
    • 正确理解:在指针上下文中NULL更语义明确
  • 误区2:假设sizeof(NULL)有确定值
    • 实际情况:取决于实现(通常与指针大小相同)
  • 误区3:对空指针进行算术运算
    • 标准规定:指针算术只能在数组范围内进行

高级话题[编辑 | 编辑源代码]

实现差异[编辑 | 编辑源代码]

不同平台的空指针表示可能不同:

  • 多数系统:二进制全0
  • 某些嵌入式系统:特殊地址值
  • 历史系统:非零表示(如Prime 50系列使用0xFFFFFFFF)

类型安全考虑[编辑 | 编辑源代码]

C++中的nullptr解决了C中NULL的一些歧义问题:

void func(int);
void func(char*);

func(NULL);    // C中可能调用错误的重载
func(nullptr); // C++11明确调用指针版本

最佳实践[编辑 | 编辑源代码]

  1. 初始化未使用的指针为NULL
  2. 在解引用前总是检查空指针
  3. 释放内存后立即将指针设为NULL
  4. 使用assert进行调试期检查:assert(ptr != NULL);
  5. 函数应明确文档化是否接受空指针参数

页面模块:Message box/ambox.css没有内容。

参见[编辑 | 编辑源代码]