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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 09:39:22