如何用scanf_s读取输入并赋值给动态分配内存?程序崩溃求助
问题解决:scanf_s导致程序崩溃的原因及修复
崩溃核心原因
微软的scanf_s是安全增强版输入函数,和标准scanf的关键区别在于:读取字符串(%s)时,必须额外传入缓冲区的大小参数,用来限制输入长度、防止缓冲区溢出。你的代码只传了movie指针,缺少这个必要参数,直接触发程序崩溃。
隐藏语法问题
你的if (movie != NULL)语句没有加{},只有紧随其后的printf属于if执行块,后面的scanf_s和printf不管内存分配成功与否都会执行。如果malloc失败(movie为NULL),写入空指针必然导致崩溃。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> int main() { char *movie = malloc(80); // sizeof(char)默认是1,可简化写法 if (movie != NULL) { printf("Enter favorite movie: "); // 传入缓冲区地址和大小(80字节) scanf_s("%s", movie, 80); printf("You entered : %s\n", movie); free(movie); // 释放内存,避免泄漏 } else { puts("Failed to allocate memory!"); } system("pause"); return 0; }
关键细节说明
- 使用
scanf_s读取字符串时,%s对应的参数顺序为:缓冲区指针 + 缓冲区大小(字节数),这是微软实现的强制要求。 - 若不想硬编码80,可使用VS自带的
_countof宏,但因为是动态分配的内存,直接写80更直观。 - 动态分配的内存必须用
free释放,养成内存管理的好习惯。 - 标准C要求
main函数返回int类型,补充return 0让代码更规范。
内容的提问来源于stack exchange,提问作者Gomvi
相关产品推荐
相关产品推荐

