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

如何用scanf读取值存入C语言动态分配变量?附崩溃代码求排查

嗨,我来帮你理清楚这两个问题~

关于用scanf读取值到动态分配变量的正确方式

动态分配变量的核心是先拿到一块合法的内存地址,然后让scanf把输入值写到这个地址里就行。步骤大概是:

  • 用malloc(或calloc)分配对应类型的内存,得到一个指针;
  • 检查内存分配是否成功(malloc失败会返回NULL,这时候不能继续操作);
  • 调用scanf时,把这个指针直接传进去——因为指针本身就代表了那块内存的地址,scanf需要的就是这个地址来存储输入值。

你的代码崩溃的原因

先把你的代码格式化出来方便查看:

#include <stdio.h>
#include <stdlib.h>
int main() { 
    int* p; 
    p=(int*)malloc(sizeof(int)); 
    printf("Enter a value : \n"); 
    scanf("%d", *p); // 这里是致命错误!
    printf("%d", *p); 
}

问题就出在scanf("%d", *p);这一行:

  • *p是对指针p的解引用操作,意思是取出p指向的内存里的内容。但你刚用malloc分配的内存是未初始化的,里面是随机的垃圾值;
  • 而scanf的第二个参数要求必须是一个内存地址(对应int*类型),你这里传了*p,相当于把那个随机垃圾值当成了内存地址。scanf尝试往这个非法地址写数据,直接触发了未定义行为,程序自然就崩溃了。

修正后的完整代码

给你改好的代码,还加了一些新手容易忽略的细节:

#include <stdio.h>
#include <stdlib.h>
int main() { 
    int* p; 
    // 分配内存,C标准里不需要强制转换malloc的返回值
    p = malloc(sizeof(int));
    // 必须检查内存是否分配成功!
    if (p == NULL) {
        printf("内存分配失败啦!\n");
        return 1;
    }
    printf("Enter a value : \n"); 
    scanf("%d", p); // 直接传p,也就是合法的内存地址
    printf("你输入的值是:%d\n", *p); 
    // 用完动态内存一定要释放,避免内存泄漏
    free(p);
    p = NULL; // 把指针置空,防止后续不小心用到野指针
    return 0;
}

最后再给你提几个新手必记的点:

  • 永远要检查malloc的返回值,内存不是无限的,分配失败是有可能发生的;
  • 动态分配的内存不用了一定要用free释放,不然程序运行久了会占满内存;
  • scanf的格式符和参数类型必须匹配,比如%d对应int*,%s对应char*,传错类型大概率会出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:16:36