跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言空指针
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Note|本条目是[[C语言指针]]系列的一部分,重点讲解空指针的概念、特性和使用场景。}} '''C语言空指针'''(Null Pointer)是指向内存地址0的特殊指针,用于表示指针不指向任何有效对象或函数。在C标准中,空指针由宏<code>NULL</code>定义,其实际值取决于实现(通常是<code>(void*)0</code>)。 == 基本概念 == 空指针在C语言中有以下核心特性: * 解引用空指针会导致'''未定义行为'''(通常是程序崩溃) * 所有指针类型都可以被赋值为<code>NULL</code> * 空指针在布尔上下文中被视为'''假'''(false) * 空指针与指向内存地址0的指针'''概念不同'''(尽管实现可能相同) === 标准定义 === C11标准(ISO/IEC 9899:2011)第6.3.2.3节规定: <blockquote> "值为0的整型常量表达式,或强制转换为<code>void*</code>的此类表达式,称为空指针常量。" </blockquote> == 语法与示例 == === 声明空指针 === <syntaxhighlight lang="c"> int *ptr = NULL; // 整型空指针 char *str = NULL; // 字符型空指针 void *vp = NULL; // 通用空指针 </syntaxhighlight> === 检测空指针 === <syntaxhighlight lang="c"> #include <stdio.h> int main() { int *ptr = NULL; if (ptr == NULL) { printf("指针为空\n"); } else { printf("指针指向地址: %p\n", (void*)ptr); } return 0; } </syntaxhighlight> {{Output| <pre> 指针为空 </pre> }} == 技术细节 == === 内存表示 === <mermaid> graph LR A[指针变量] -->|存储值| B[0x00000000] B --> C[不指向任何有效内存] </mermaid> === 与零指针的区别 === {| class="wikitable" |- ! 特性 !! 空指针 !! 零指针 |- | 语义 | 表示"无指向" | 指向地址0 |- | 标准保证 | 所有实现一致 | 实现相关 |- | 解引用 | 绝对禁止 | 可能允许(系统相关) |} == 实际应用 == === 链表终止标记 === <syntaxhighlight lang="c"> struct Node { int data; struct Node *next; // 空指针表示链表结束 }; void printList(struct Node *n) { while (n != NULL) { printf("%d ", n->data); n = n->next; } } </syntaxhighlight> === 动态内存分配错误处理 === <syntaxhighlight lang="c"> #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; } </syntaxhighlight> == 常见误区 == * '''误区1''':认为<code>NULL</code>和<code>0</code>可以无条件互换 ** 正确理解:在指针上下文中<code>NULL</code>更语义明确 * '''误区2''':假设<code>sizeof(NULL)</code>有确定值 ** 实际情况:取决于实现(通常与指针大小相同) * '''误区3''':对空指针进行算术运算 ** 标准规定:指针算术只能在数组范围内进行 == 高级话题 == === 实现差异 === 不同平台的空指针表示可能不同: * 多数系统:二进制全0 * 某些嵌入式系统:特殊地址值 * 历史系统:非零表示(如Prime 50系列使用0xFFFFFFFF) === 类型安全考虑 === C++中的<code>nullptr</code>解决了C中<code>NULL</code>的一些歧义问题: <syntaxhighlight lang="cpp"> void func(int); void func(char*); func(NULL); // C中可能调用错误的重载 func(nullptr); // C++11明确调用指针版本 </syntaxhighlight> == 最佳实践 == # 初始化未使用的指针为<code>NULL</code> # 在解引用前总是检查空指针 # 释放内存后立即将指针设为<code>NULL</code> # 使用assert进行调试期检查:<code>assert(ptr != NULL);</code> # 函数应明确文档化是否接受空指针参数 {{Warning|永远不要尝试解引用空指针,这是C语言中最常见的程序崩溃原因之一。}} == 参见 == * [[C语言指针]] * [[C语言动态内存管理]] * [[C语言未定义行为]] [[Category:编程语言]] [[Category:C]] [[Category:C 语言指针]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Mbox
(
编辑
)
模板:Note
(
编辑
)
模板:Output
(
编辑
)
模板:Warning
(
编辑
)
模块:Arguments
(
编辑
)
模块:Message box
(
编辑
)
模块:Message box/ambox.css
(
编辑
)
模块:Message box/configuration
(
编辑
)
模块:Yesno
(
编辑
)