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

为何无法用未初始化的int指针通过scanf接收输入?

为什么未初始化的指针无法用scanf接收输入?

指针的核心作用是存储内存地址,要通过指针写入数据,它必须指向一块程序有权限访问的合法内存区域。

第一段程序出错的原因

你定义的int *prt是未初始化的指针,它的初始值是随机的——可能指向操作系统的内核保护内存、其他进程的私有内存,或者当前程序未分配的无效地址。当你用scanf("%d", prt)尝试往这个随机地址写入数据时:

  • 如果指向的是操作系统禁止用户程序访问的区域,操作系统会直接终止程序,抛出Segmentation fault (core dumped)错误;
  • 就算指向的是当前程序的内存,这块内存也没有被合法分配给你的变量,写入操作会破坏程序的其他数据,同样可能导致崩溃或异常行为。

第二段程序正常的原因

你先定义了int x,这时候操作系统会为x在程序的栈空间分配一块合法的、有读写权限的内存。然后int *p = &x把p绑定到x的内存地址上,此时p指向的是明确合法的内存区域。scanf("%d", p)本质是往x的内存里写入数据,完全符合操作系统的内存访问规则,所以能正常运行。

代码示例对比

错误代码(触发段错误):

#include <stdio.h>
int main() {
    int *prt; // 未初始化,指针值随机
    scanf("%d", prt);
    return 0;
}

正确代码:

#include <stdio.h>
int main() {
    int x;
    int *p = &x; // 指针绑定到合法变量的地址
    scanf("%d", p);
    printf("输入的值是:%d\n", *p);
    return 0;
}

简单来说:未初始化的指针没有合法的内存指向,强行写入数据属于非法内存访问,必然会被操作系统拦截。只有让指针指向一块已分配的合法内存(比如栈上的变量,或者用malloc动态分配的堆内存),才能用它来接收输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:19:58