如何用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
相关产品推荐
相关产品推荐

