You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中未赋值NULL的未初始化指针是否会预留对应内存地址?

问题结论先行

不会预留指针所指向的内存空间,未初始化的野指针不存在“对应内存被独占保留”的说法,核心误区是混淆了指针变量自身的存储空间和指针指向的目标存储空间两个完全独立的概念。


分场景详细说明

首先先把两个核心概念掰清楚,这是90%的指针新手会搞混的点:

  • 指针本质就是个存内存地址的普通变量,它自己需要占一块固定大小的空间(64位系统下通常是8字节,32位下是4字节),用来存它指向的地址数值。
  • 指针里存的那个地址对应的内存块,是它“指向”的目标空间,和指针变量自己的空间没有任何绑定关系。

1. 指针变量自身的存储空间:确实会被分配保留

只要你完成了指针变量的声明,在它的生命周期内,存这个指针值的那块空间是属于它的,不会被其他数据随意占用:

  • 全局指针、static修饰的静态指针:存在程序的静态数据区,从程序启动到退出都归这个指针变量使用
  • 函数内声明的普通局部指针:存在栈上,从函数执行到声明位置开始,到函数返回为止,这块栈空间是预留给这个指针变量存地址值用的

2. 指针指向的目标内存:完全不会预留

这部分是疑惑的核心,结论非常明确:只要你没手动给指针赋予合法的指向地址,系统根本不知道你想让这个指针指到哪,不可能提前给你预留目标空间:

  • 全局/静态指针就算不手动赋值,会被自动初始化为NULL(也就是地址值0),这个地址是系统保留的不可访问区域,根本不属于用户可用的内存范畴,不存在“预留空间给你用”的说法,直接解引用会直接触发段错误。
  • 函数内的局部自动指针如果不手动初始化,存的是之前栈空间残留的随机垃圾值,也就是常说的野指针:
    • 这个随机地址可能指向你程序里已经被其他变量占用的栈空间
    • 可能指向已经被free掉的堆内存
    • 可能指向系统内核保留的内存区域
    • 可能指向根本没有映射到物理内存的无效地址
      没有任何机制会给这个随机地址对应的空间加“占用锁”,这块空间该被别的数据用就会被用,你要是敢直接解引用这个野指针写数据,要么直接程序崩溃,要么会悄无声息改坏别的变量的值,出极难排查的bug。

常见误区纠正

很多新手会有个错误认知:“我声明了int *p;,系统就会自动给我留一块存int的空间让p指着”,这个是完全错误的。指针只是个存地址的“门牌号容器”,你不自己把合法可用的门牌号(要么是用&取的已有变量的地址,要么是malloc申请到的堆内存地址)塞进去,它就是个装着废纸的空盒子,根本对应不到任何属于你的可用空间。

举个最简单的验证代码:

#include <stdio.h>

int main() {
    int *wild_p; // 未初始化,也没赋值为NULL
    int val = 123;
    // 多次运行你会发现每次打印的wild_p的值都可能不一样,是随机残留值
    printf("野指针存储的随机地址:%p\n", (void*)wild_p);
    // 下面这行不要随便运行,大概率触发段错误,就算不崩也是非法内存访问
    // *wild_p = 456;
    return 0;
}

内容的提问来源于stack exchange,提问作者PuuRaidur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:01:07